我的Dividing Sequences代码有什么问题

时间:2016-09-14 20:37:37

标签: python algorithm

我正在尝试编码此问题:

  

这个问题是关于正整数序列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

3 个答案:

答案 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])