我正在努力应对以下挑战:
https://www.codeeval.com/open_challenges/89/
我的解决方案:
import sys
test_cases = open(sys.argv[1], 'r')
sum_track=0
index_track = 0
for test in test_cases:
test = test.split()
test = [int(x) for x in test]
max_num = max([test[max([0,index_track])],test[min([len(test)-1,index_track+1])]])
print "adding " +str(max_num) # this line helps "track" my path through the triangle
sum_track+= max_num
index_track = test.index(max_num)
test_cases.close()
print sum_track
作为参考,这是正在测试的“三角形”:
http://www.yodlecareers.com/puzzles/triangle.txt
我得到665321作为总和,这是不正确的。我已经尝试检查上面的代码打印输出文件的步骤,对于前10行似乎是正确的,显然我不会手动完成整个事情。有没有人曾经在这个挑战中工作过?
答案 0 :(得分:3)
考虑这样的三角形:
1
2 3
99 4 5
您的算法将“贪婪”地遵循它看到的最大数字并最终找到1+3+5
。显然这不是最大的总和,因为它忽略了三角形中明显的99
!
答案 1 :(得分:1)
这很简单,可以使用动态编程完成。但是您必须从叶子(示例中的第4行)开始评估,而不是从根节点开始评估,然后向后工作。所以倒三角形是
0 7 1 5
4 6 8
9 6
5
现在通过递归解决,
f(row,col) = max(f(row-1,col), f(row-1,col+1))
,边界条件为f(0, col) = value(0, col)
。终止于最后一行