Pascal三角形最大路径

时间:2017-06-24 23:14:57

标签: python arrays pascals-triangle

我正在尝试解决项目Euler中的问题18。见https://projecteuler.net/problem=18

def maxpath(triangle):
    p = 0
    total = 0
    for x in range(0,len(triangle)):
        if p + 1 < len(triangle[x]) - 1:
            if triangle[x][p+1] > triangle[x][p]:
                p += 1
        total += triangle[x][p]
    return total

给定一个二维列表,它将找到从三角形顶部到底部的最大路径。有人可以解释这段代码有什么问题吗?

1 个答案:

答案 0 :(得分:1)

除了这一行外,所有内容都会检出:

if p + 1 < len(triangle[x]) - 1:

这里实际上有两个问题。第一个是p而不是p + 1。考虑到它,p的当前值从前一行继续,对于第一行之后的任何行。所以p + 1保证定义明确。实际上,你可以从1开始,从第二行开始迭代,你甚至不需要那个条件。

第二个问题是次要问题,但您不需要每次都计算长度。行的长度总是等于0-index加1,所以只需与x进行比较。

这是修复后代码的样子:

def maxpath(triangle):
    p = 0
    total = 0
    for x in range(len(triangle)):
        if p < x and (triangle[x][p + 1] > triangle[x][p]):
                p += 1
        total += triangle[x][p]
    return total

现在,

maxpath([[3], [7, 4], [2, 4, 6], [8, 5, 9, 3]]) # Euler website example

制作

23

如果您想进一步优化它(删除x < p检查,您可以这样做:

def maxpath(triangle):    
    p = 0
    total = triangle[0][0]
    for x in range(1, len(triangle)):
        if triangle[x][p + 1] > triangle[x][p]:
            ... # the rest stays the same