210406アルゴリズム
アルゴリズム210406
<差が最大>
n個数えた場合(3<=N<=8)
|A[0] - A[1]| + |A[1] - A[2]| + … + |A[N-2] - A[N-1]|
最大の問題
N! = 8! = 40320 Pythonソース def next_permutation(a):
i = len(a)-1
while i > 0 and a[i-1] >= a[i]:
i -= 1
if i <= 0:
return False
j = len(a)-1
while a[j] <= a[i-1]:
j -= 1
ans = 0
for i in range(1, len(a)):
ans += abs(a[i]-a[i-1])
return ans
n = int(input())
a = list(map(int,input().split()))
a.sort()
ans = 0
while True:
temp = calc(a)
ans = max(ans, temp)
if not next_permutation(a):
break
print(ans)
『外判員巡り』
英語に翻訳されたSalesman Problem(TSP)
1番からN番までの都市があります.
一つの都市から、Nのすべての都市を経て、元の都市に戻ります.
お帰りなさい.(かつて行った町には戻れない)
この時点で必要なコストが最も低い Pythonソース def next_permutation(a):
i = len(a)-1
while i > 0 and a[i-1] >= a[i]:
i -= 1
if i <= 0:
return False
j = len(a)-1
while a[j] <= a[i-1]:
j -= 1
w = [list(map(int,input().split())) for _ in range(n)]
d = list(range(n))
ans = 2147483647
while True:
ok = True
s = 0
for i in range(0, n-1):
if w[d[i]][d[i+1]] == 0:
ok = False
break
else:
s += w[d[i]][d[i+1]]
if ok and w[d[-1]][d[0]] != 0:
s += w[d[-1]][d[0]]
ans = min(ans, s)
if not next_permutation(d):
break
print(ans)
<宝くじ>
同じ数があってもシーケンスを生成できます.
与えられたK個の入力数の中から6個の数を選択する問題.
再帰関数で解くことができます.
再帰関数は、1つの関数から自分を再呼び出してタスクを実行することによって、所与の問題を解決する方法である.
Pythonを使用すると、Pythonは関数の深さ制限がほぼ1000であることに気づくので、995回程度戻るとシャットダウンします.
def next_permutation(a):
i = len(a)-1
while i > 0 and a[i-1] >= a[i]:
i -= 1
if i <= 0:
return False
j = len(a)-1
while a[j] <= a[i-1]:
j -= 1
n, a = list(map(int,input().split()))
if n == 0:
break
d = [0](n-6)+[1]*6
ans = []
while True:
cur = [a[i] for i in range(n) if d[i] == 1]
ans.append(cur)
if not next_permutation(d):
break
ans.sort()
for v in ans:
print(' '.join(map(str,v)))
print()
<差が最大>
n個数えた場合(3<=N<=8)
|A[0] - A[1]| + |A[1] - A[2]| + … + |A[N-2] - A[N-1]|
最大の問題
N! = 8! = 40320
i = len(a)-1
while i > 0 and a[i-1] >= a[i]:
i -= 1
if i <= 0:
return False
j = len(a)-1
while a[j] <= a[i-1]:
j -= 1
a[i-1],a[j] = a[j],a[i-1]
j = len(a)-1
while i < j:
a[i],a[j] = a[j],a[i]
i += 1
j -= 1
return True
def calc(a):ans = 0
for i in range(1, len(a)):
ans += abs(a[i]-a[i-1])
return ans
n = int(input())
a = list(map(int,input().split()))
a.sort()
ans = 0
while True:
temp = calc(a)
ans = max(ans, temp)
if not next_permutation(a):
break
print(ans)
『外判員巡り』
英語に翻訳されたSalesman Problem(TSP)
1番からN番までの都市があります.
一つの都市から、Nのすべての都市を経て、元の都市に戻ります.
お帰りなさい.(かつて行った町には戻れない)
この時点で必要なコストが最も低い
i = len(a)-1
while i > 0 and a[i-1] >= a[i]:
i -= 1
if i <= 0:
return False
j = len(a)-1
while a[j] <= a[i-1]:
j -= 1
a[i-1],a[j] = a[j],a[i-1]
j = len(a)-1
while i < j:
a[i],a[j] = a[j],a[i]
i += 1
j -= 1
return True
n = int(input())w = [list(map(int,input().split())) for _ in range(n)]
d = list(range(n))
ans = 2147483647
while True:
ok = True
s = 0
for i in range(0, n-1):
if w[d[i]][d[i+1]] == 0:
ok = False
break
else:
s += w[d[i]][d[i+1]]
if ok and w[d[-1]][d[0]] != 0:
s += w[d[-1]][d[0]]
ans = min(ans, s)
if not next_permutation(d):
break
print(ans)
<宝くじ>
同じ数があってもシーケンスを生成できます.
与えられたK個の入力数の中から6個の数を選択する問題.
再帰関数で解くことができます.
再帰関数は、1つの関数から自分を再呼び出してタスクを実行することによって、所与の問題を解決する方法である.
Pythonを使用すると、Pythonは関数の深さ制限がほぼ1000であることに気づくので、995回程度戻るとシャットダウンします.
def next_permutation(a):
i = len(a)-1
while i > 0 and a[i-1] >= a[i]:
i -= 1
if i <= 0:
return False
j = len(a)-1
while a[j] <= a[i-1]:
j -= 1
a[i-1],a[j] = a[j],a[i-1]
j = len(a)-1
while i < j:
a[i],a[j] = a[j],a[i]
i += 1
j -= 1
return True
while True:n, a = list(map(int,input().split()))
if n == 0:
break
d = [0](n-6)+[1]*6
ans = []
while True:
cur = [a[i] for i in range(n) if d[i] == 1]
ans.append(cur)
if not next_permutation(d):
break
ans.sort()
for v in ans:
print(' '.join(map(str,v)))
print()
Reference
この問題について(210406アルゴリズム), 我々は、より多くの情報をここで見つけました https://velog.io/@drcho10/210406알고리즘テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol