为什么我的代码找不到总和最大的路径?

时间:2014-01-11 19:42:05

标签: python

我正在做一些你以前可能见过的问题。

我正在尝试在树中找到具有最大总和的路径,如下所示:

   03  
 04 05  
02 03 06  

等等。我将树复制到文本文件'dataset'中,所以它看起来像这样:

03  
04 05  
02 03 06  

然后将其解析为2d数组,但我的两个嵌套for循环在示例中找到了正确的答案,但不是主要问题。答案由计算机检查,所以我不知道应该是什么。

tree = [[]]
highest = 0
f = open("dataset","r") #contains the data from the problem

for line in f: #parser
   for i in range(0,len(line),3):
      tree[-1].append(int(line[i:i+2]))
   tree.append([])
tree.pop()

for i in range(len(tree)):
   highest += tree[i][0]

total = highest

for j in range(1,len(tree)):
   for i in range(len(tree)-1,j-1,-1):
      print(i,j)
      total -= tree[i][j-1]
      total += tree[i][j]
      if(total>highest):
         highest = total

print(highest)

解析器会打印出完整的数据集。由于这是一个算法问题,因此它们不会给出棘手的解析问题。

double for循环使用所有左边的总数,然后从该行中减去最后一个数字并添加新行。它从右到左解析树。

我认为这可能是一个边界错误,但我没有在任何地方看到它。

知道我哪里出错了?

2 个答案:

答案 0 :(得分:1)

您的索引已关闭。

for i in range(0,len(line),3):

会为你提供这条线

2 3 6

指数03; 024。采用索引和切片方法效率不高,请使用split

"2 3 6\n".strip().split(" ") == ['2', '3', '6']

请注意,即使您包含两位数的整数,这也会有效。

您可以使用map转换列表中的所有项目:

map(int, ['2', '3', '6']) == [2, 3, 6]

答案 1 :(得分:0)

扫一扫:

tree = [
      [0],
     [0,0],
    [0,1,0],
   [0,0,1,0]
]

您的算法失败。这很容易看到:当它到达3, 2时,它已经忘记了2, 1处的1。

我不知道任何没有辅助内存行的算法,所以我只想找到aga更简单的解决方案。

我用这个测试了代码:

tree_node_cost = [
    ...
]

cost_cache = tree_node_cost[0]

for row_node_costs in tree_node_cost[1:]:
    out_cache = [0] * (len(cost_cache) + 1)

    for i, cache in enumerate(cost_cache):
        out_cache[i] = max(out_cache[i], row_node_costs[i] + cache)
        out_cache[i+1] = row_node_costs[i+1] + cache

    cost_cache = out_cache

max(cost_cache)

作为我的“可信”代码和随机生成的树,看看有什么不同,所以你就是。