我正在尝试编码此问题:
这个问题是关于正整数序列a1,a2,...,aN。一个 序列的子序列是通过删除一些序列获得的任何东西 元素。例如,3,7,11,3是一个子序列 6,3,11,5,7,4,3,11,5,3,但3,3,7不是后续的 6,3,11,5,7,4,3,11,5,3。
给定一系列整数,你的目标是找到这个序列中最长的完全分裂子序列的长度。
完全分裂的序列是序列a1,a2,...,aN,其中ai除以 aj每当我<学家例如,3,15,60,720是完全分开的 序列
我的代码是:
n=input()
ar=[]
temp=0
for i in range (0,n):
temp=input()
ar.append(temp)
def best(i):
if i==0:
return (1)
else:
ans =1
for j in range (0,i):
if (ar[j]%ar[i]==0):
ans=max(ans,(best(j)+1))
return (ans)
an=[]
for i in range (0,n):
temp=best(i)
an.append(temp)
print max(an)
输入
9
2
3
7
8
14
39
145
76
320
我应该得到3(因为2,8,320)作为输出,但我得到1
答案 0 :(得分:3)
作为j < i
,您需要检查a[j]
是a[i]
的分隔符,而不是相反。所以这意味着你需要设置这个条件(并且只这个条件,而不是与逆向组合):
if (ar[i]%ar[j]==0):
通过此更改,给定样本数据的输出为3。
混淆来自定义,其中i < j
位于代码j < i
中。
答案 1 :(得分:3)
这可以在不使用任何递归的情况下解决您的问题:)
n = int(input())
ar = []
bestvals = []
best_stored = []
for x in range(n):
ar.append(int(input()))
best_stored.append(0)
best_stored[0] = 1
for i in range(n):
maxval = 1
for j in range(i):
if ar[i] % ar[j] == 0:
maxval = max(maxval,(best_stored[j])+1)
best_stored[i] = maxval
print(max(best_stored))
答案 2 :(得分:0)
对于我在评论中提到的图论解决方案:
class Node(object):
def __init__(self, x):
self.x = x
self.children = []
def add_child(self, child_x):
# Not actually used here, but a useful alternate constructor!
new = self.__class__(child_x)
self.children.append(new)
return new
def how_deep(self):
"""Does a DFS to return how deep the deepest branch goes."""
maxdepth = 1
for child in self.children:
maxdepth = max(maxdepth, child.how_deep()+1)
return maxdepth
nums = [9, 2, 3, 7, 8, 14, 39, 145, 76, 320]
nodes = [Node(num) for num in nums]
for i,node in enumerate(nodes):
for other in nodes[i:]:
if other.x % node.x == 0:
node.children.append(other)
# graph built, rooted at nodes[0]
result = max([n.how_deep() for n in nodes])