项目欧拉问题67不太正确

时间:2010-08-23 14:27:00

标签: python

我有以下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呢?

任何人都可以看到我假设或做错了吗?

2 个答案:

答案 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];
    }
}