Path sum: two ways

In the 5 by 5 matrix below, the minimal path sum from the top left to the bottom right, by only moving to the right and down, is indicated in bold red and is equal to 2427.

         
131 673 234 103 18
201 96 342 965 150
630 803 746 422 111
537 699 497 121 956
805 732 524 37 331

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 top left to the bottom right by only moving right and down.


路径和:两个方向

在如下的5乘5矩阵中,从左上方到右下方始终只向右或向下移动的最小路径和为2427,由标注红色的路径给出。

         
131 673 234 103 18
201 96 342 965 150
630 803 746 422 111
537 699 497 121 956
805 732 524 37 331

在这个31K的文本文件matrix.txt(右击并选择“目标另存为……”)中包含了一个80乘80的矩阵,求出从该矩阵的左上方到右下方始终只向右和向下移动的最小路径和。

解题

这个题目很简单的

对第0列和第0行的数直接向下加

第0列:data[i][0] = data[i][0] + data[i-1][0]  for i in 1:row - 1

第0行: data[0][i] = data[0][i] + data[0][i-1] for i in 1:col-1

其他情况

for i in 1:row -1

for j in 1:col-1

data[i][j] = data[i][j] + min(data[i-1][j],data[i][j-1])

最后元素data[row-1][col-1]就是最小路径的值。

Python

import time ;
import numpy as np def run():
filename = 'E:/java/projecteuler/src/Level3/p081_matrix.txt'
data = readData(filename)
Path_Sum(data) def Path_Sum(data):
row,col = np.shape(data)
for i in range(1,row):
data[0][i] = data[0][i]+data[0][i-1]
data[i][0] = data[i][0] + data[i-1][0]
for i in range(1,row):
for j in range(1,col):
data[i][j] += min(data[i-1][j],data[i][j-1])
print data[row-1][col-1] def readData(filename):
fl = open(filename)
data =[]
for row in fl:
row = row.split(',')
line = [int(i) for i in row]
data.append(line)
return data
if __name__=='__main__':
t0 = time.time()
run()
t1 = time.time()
print "running time=",(t1-t0),"s" #
# running time= 0.00799989700317 s

参考博客中的读取文件,这个读取文件的思想很好的,自己对于读取文件还不是很熟悉

上个Python程序是按照左上到右下走的

下面java的是按照右下向左上走的

package Level3;

import java.awt.List;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList; public class PE081{ static int[][] grid;
static void run() throws IOException{
String filename = "src/Level3/p081_matrix.txt";
String lineString = "";
ArrayList<String> listData = new ArrayList<String>();
BufferedReader data = new BufferedReader(new FileReader(filename));
while((lineString = data.readLine())!= null){
listData.add(lineString);
}
// 分配大小空间的 定义的grid 没有定义大小
assignArray(listData.size());
// 按照行添加到数组grid中
for(int index = 0,row_counter=0;index <=listData.size() - 1;++index,row_counter++){
populateArray(listData.get(index),row_counter);
}
System.out.println(Path_min(grid)); }
public static int Path_min(int[][] data){
int size = data.length;
for(int i=size -2;i>=0;--i){
data[i][size-1] += data[i+1][size-1];
data[size-1][i] += data[size-1][i+1];
}
for( int index = size -2;index >=0;index--){
for(int innerIndex = size -2;innerIndex >=0;innerIndex--){
data[index][innerIndex] += Math.min(data[index+1][innerIndex],
data[index][innerIndex+1]);
}
}
return data[0][0];
}
// 每行的数据添加到数组中
public static void populateArray(String str,int row){
int counter = 0;
String[] data = str.split(",");
for(int index = 0;index<=data.length -1;++index){
grid[row][counter++] = Integer.parseInt(data[index]);
}
}
public static void assignArray(int no_of_row){
grid = new int[no_of_row][no_of_row];
} public static void main(String[] args) throws IOException{
long t0 = System.currentTimeMillis();
run();
long t1 = System.currentTimeMillis();
long t = t1 - t0;
System.out.println("running time="+t/1000+"s"+t%1000+"ms");
// 427337
// running time=0s38ms
}
}

最新文章

  1. json简单使用
  2. javascript运行机制
  3. ASCII、Unicode、GBK和UTF-8字符编码的区别联系
  4. C语言与套接字
  5. 用R在字符串中提取匹配的部分
  6. C#总结2
  7. matplotlib 显示中文
  8. UVALive 3635 Pie 切糕大师 二分
  9. table常用
  10. mysql vachar
  11. man page里面函数后面的括号中的数字代表的含义。
  12. 【2016北京集训测试赛】azelso
  13. Gparted Live分区调整
  14. Linux中修改环境变量及生效方法(永久、临时)环境变量查看
  15. hadoop运行一段时间后无法stop-all的问题
  16. 推荐一款移动端的web UI控件 -- mobiscroll
  17. Thread in depth 4:Synchronous primitives
  18. 设计模式(java)--Bridge模式之蜡笔与毛笔的故事
  19. Cors Http 访问控制
  20. OSG学习:矩阵变换节点示例

热门文章

  1. linux od命令: 按不同进制显示文件
  2. 【Qt】Qt之自定义界面(QMessageBox)【转】
  3. http 错误编号大全(转)
  4. 1101. Quick Sort (25)
  5. Microsoft Press Free eBook
  6. Python支持中文注释
  7. Android bluetooth low energy (ble) writeCharacteristic delay callback
  8. 所有的代码生成器都是浮云,如果可以用aspx文件作为模板
  9. .NET操作JSON
  10. JavaScript跨域总结与解决办法(转)