我正在做一些你以前可能见过的问题。
我正在尝试在树中找到具有最大总和的路径,如下所示:
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
循环使用所有左边的总数,然后从该行中减去最后一个数字并添加新行。它从右到左解析树。
我认为这可能是一个边界错误,但我没有在任何地方看到它。
知道我哪里出错了?
答案 0 :(得分:1)
您的索引已关闭。
for i in range(0,len(line),3):
会为你提供这条线
2 3 6
指数0
和3
; 不 0
,2
和4
。采用索引和切片方法效率不高,请使用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)
作为我的“可信”代码和随机生成的树,看看有什么不同,所以你就是。