码迷,mamicode.com
首页 > 其他好文 > 详细

Project Euler:Problem 82 Path sum: three ways

时间:2015-07-21 17:10:05      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:project euler   动态规划   最短路径   矩阵   

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))



版权声明:本文为博主原创文章,未经博主允许不得转载。

Project Euler:Problem 82 Path sum: three ways

标签:project euler   动态规划   最短路径   矩阵   

原文地址:http://blog.csdn.net/youb11/article/details/46987605

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!