Project Euler 67: Maximum path sum II
作者:互联网
从以下这个三角形的顶部开始,向相邻的下一行的数字移动,经过之数所能得到的最大的和为23,即:\(3+7+4+9=23\)
\[ 3\\ 7\quad4\\ 2\quad4\quad6\\ 8\quad5\quad9\quad3 \]
对于文本文件中包含的一百行的三角形(见数据文件ep67.txt),求其从上到下所有路径中最大的和。注:这个问题是第十八个问题一个更困难的版本,不可能通过深度尝试每条路径来解决这个问题,因为总共有\(2^{99}\)条路径!如果你可以一秒种检查\(10^{12}\)条路径,检查完全部路径也需要花费两百亿年,肯定有一个更有效率的算法。
分析:这个问题我们在第十八题中的已经使用动态规划的方法解决了,代码可以不加修改的直接使用,只需要把数据文件改成这里的文件就可以了,相关思路大家可以参阅第十八题,这里直接列代码:
with open('data/ep67.txt') as f:
table = [list(map(int,s.split())) for s in f.readlines()]
# approach 1: bottom-up method, time cost = 62.1 µs ± 5.71 µs
def main():
for row in range(len(table)-1, 0, -1):
for col in range(0, row):
table[row-1][col] += max(table[row][col], table[row][col+1])
return table[0][0]
# approach 2: top-down method, time cost = 131 ns ± 8.97 ns
from functools import lru_cache
@lru_cache(maxsize=128)
def mps(r=0,c=0):
if r == len(table)-2:
return table[r][c] + max(table[r+1][c],table[r+1][c+1])
else:
return table[r][c] + max(mps(r+1,c),mps(r+1,c+1))
标签:return,sum,路径,Maximum,II,mps,table,col,row 来源: https://www.cnblogs.com/metaquant/p/11950086.html