2012-05-15 65 views
-5

我必须编写一个函数,计算并返回我们可以从列表中的每个级别存储的知识库中实现的最大收益 。Python最大收益

为了测试这个功能主要是:

if __name__ == "__main__": 
    l0 = [[7], [3,8], [8,1,0], [2,7,4,4], [4,5,2,6,5]] 
    l1 = [[11], [7,32], [14,14,14], [0,1,2,3], [5,99,1,2,7], 
     [0,25,9,45, 54,1], [99,88,77,66,55,44,33]] 
>>>30 
>>>270 

我试图从底部到顶部开始,还有没有其他的解决办法?

你能想象像一棵树

[7] 
    [3,8] 
[8,1,0] 
[2,7,4,4] 

等等... 我想达到的是有最大的好处步行列表,选用的权重由该数给出列表中,我曾经也有最大化我的路

我已经写了这个解决方案

def maxpath(listN): 
    liv = len(listN) -1 
    return calcl(listN,liv) 

def calcl(listN,liv): 
    if liv == 0: 
    return listN[0] 
    listN[liv-1] = [(listN[liv-1][i]+listN[liv][i+1],listN[liv-1][i]+listN[liv][i]) \ 
       [ listN[liv][i] > listN[liv][i+1] ] for i in range(0,liv)] 
    return calcl(listN,liv-1) 

print(maxpath(l0)) 
print(maxpath(l1)) 

#output 
[30] 
[270] 
+2

毫无疑问,这里 –

+0

有没有任何其他解决方案,除了开始从底部计算至顶列表? – fege

+1

可能。很难说没有任何想法是什么问题。把自己置于我们的位置。问问你自己,我们将从问题中的代码中学到什么。 –

回答

1

可能的路线通过树的数量是2**rows 。到给定节点的可能路由的数量由二项式展开给出。您可以非常简单地从树的头部增加可能的路径,每个节点只有两个可能的下一步移动,它们在列表中的索引与当前位置相同或多一个。

解决此问题的一种简单方法是为给定数量的行生成所有可能的路径。 create_paths()这样做,通过树返回所有可能的路线。功能max_cost()使用此功能评估所有路线与成本树,并返回最昂贵路线的值。我让你获得实际的路线了(不是很辛苦。):)

L_0 = [[7], [3,8], [8,1,0], [2,7,4,4], [4,5,2,6,5]] 
L_1 = [[11], [7,32], [14,14,14], [0,1,2,3], [5,99,1,2,7], 
     [0,25,9,45, 54,1], [99,88,77,66,55,44,33]] 

def create_paths(rows): 
    new_paths = [] 
    paths = [[0]] 
    for row in xrange(rows): 
     for path in paths: 
      new_paths.append(path+[path[-1]]) 
      new_paths.append(path+[path[-1]+1]) 
     paths = new_paths 
     new_paths = [] 
    return paths 

def max_cost(tree): 
    costs = [] 
    paths = create_paths(len(tree)-1) 
    for path in paths: 
     costs.append(sum([tree[i][j] for i, j in enumerate(path)])) 
    return max(costs) 

print max_cost(L_0) 
print max_cost(L_1) 

#output: 
30 
270