我正在尝试解决项目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
给定一个二维列表,它将找到从三角形顶部到底部的最大路径。有人可以解释这段代码有什么问题吗?
答案 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