我有以下Python代码,我为姐妹问题18撰写。
它适用于problem 18,但稍微适用于problem 67。我不能为我的生活找出原因。
triangle = [
[59],
[73, 41],
[52, 40, 9],
[26, 53, 6, 34],
[10, 51, 87, 86, 81],
[61, 95, 66, 57, 25, 68],
...
]
def max_adjacent(row,col):
return max(triangle[row][col]+triangle[(row+1)][col], triangle[row][col]+triangle[(row+1)][(col+1)])
if __name__ == '__main__':
row = len(triangle)-2
while row >= 0:
triangle[row] = [max_adjacent(row,triangle[row].index(i)) for i in triangle[row]]
row -= 1
print(triangle[0][0])
算法将从最后一行开始,并将此行中的每个数字替换为自身加上下一行中最大的相邻数字。 (例如,在上面部分定义的三角形中,最后一行中的10
将替换为105
。)它只是将其循环直到它位于三角形顶部的第0行,并打印超出此行的第一个元素,现在是最大总和。
这给出了7220
的答案,我知道这是接近但错误的。我想知道为什么它适用于问题18呢?
任何人都可以看到我假设或做错了吗?
答案 0 :(得分:4)
问题可能在于您正在使用index
功能。如果您有一个连续两次的数字,index
将始终为您提供该数字首次出现的索引。
我猜问题18在一行中没有重复,当前的问题有。
答案 1 :(得分:0)
此代码可能有所帮助。使用DP
的概念在java中完成 public static int max(int a,int b)
{
return a>=b?a:b;
}
public static int maxSumPath(int a[][],int cacher[][],int r,int k)
{
if(r==100)
return 0;
else if(cacher[r][k]!=0)
{
return cacher[r][k];
}
else
{
cacher[r][k] = cacher[r][k] + max(maxSumPath(a,cacher,r+1,k),maxSumPath(a,cacher,r+1,k+1)) + a[r][k];
return cacher[r][k];
}
}