Project Euler:Problem 82 Path sum: three ways

The minimal path sum in the 5 by 5 matrix below, by starting in any cell in the left column and finishing in any cell in the right column, and only moving up, down, and right, is indicated in red and bold; the sum is equal to 994.

131201630537805673968036997322343427464975241039654221213718150111956331

Find the minimal path sum, in matrix.txt (right click and "Save Link/Target As..."), a 31K text file containing a 80 by 80 matrix, from the left column to the right column.


动态规划

从第一列任意位置开始,只能向上向下向右移动到达最后一列,使得经过数字的和最小。因为不知道是从哪个起点出发的元素路径和最小,把这所有的路径和存在一个一维数组ans[80]中。该数组的初始值为矩阵第一列上的元素。

第一列上的元素接下来的移动一定是向右的,不可能向上或者向下,因为第一列上的任意元素都可以作为起始元素。

动态规划体现在在元素向右和向下比较和向右和向上比较中。


在元素向右和向下比较中

ans[j-1]是比较新的值,是已经加到第i列上的元素了的,而ans[j]是比较旧的值,才算到第i-1列上的元素。

ans[j]的新值应该是ans[j-1]+ls[j][i]和ans[j]+ls[j][i]中最小的那个。


在元素向右向上比较中:

这些ans[j]都是算到第i的元素上的了

ans[j+1]要想移动到ans[j]要算上ls[j][i]才行

所以ans[j]的新值是ans[j]和ans[j+1]+ls[j][i]的最小值。


这个矩阵下标是左上角为(79,79)右下角为(0,0)


最后输出ans中的最小值即可。


ls=[]
for line in open("matrix.txt"):
    #print(line)
    a=line.split(',')
    a=[int(i) for i in a]
    ls.append(a)


ans=[ls[i][79] for i in range(80)]

for i in range(78,-1,-1):
    ans[0]=ans[0]+ls[0][i]

#向下
    for j in range(1,80):
        ans[j]=min(ans[j]+ls[j][i],ans[j-1]+ls[j][i])

#向上
    for j in range(78,-1,-1):
        ans[j]=min(ans[j],ans[j+1]+ls[j][i])

print(min(ans))



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值