学习目标:
目标:学习动态规划相关知识
学习内容:
本文内容:带权值的最小路径和
题目描述
给定一个由非负整数填充的m x n的二维数组,现在要从二维数组的左上角走到右下角,请找出路径上的所有数字之和最小的路径。
注意:你每次只能向下或向右移动。
示例1
输入
[[1,2],
[5,6],
[1,1]]
返回值:8
与本题类似的题目:
解题思路
动态规划题目,首先需要分析出状态,状态转移方程,初始状态
- 状态
子状态:从(0,0)到达(1,0),(1,1),(2,1),…(m-1,n-1)的最短路径
F(i,j):从(0,0)到达F(i,j)的最短路径
- 状态转移方程
F(i,j)=F(i,j)+min(F(i,j-1),F(i-1,j))
- 初始状态
F(0,0) = (0,0)
F(0,i) = F(0,i-1) + (0,i)
F(i,0) = F(i-1,0) + (i,0)
- 返回结果:
F(m-1,n-1)
实现代码
public class PathSum_3 {
public int minPathSum (int[][] matrix) {
// write code here
int line =matrix.length;
if(line==0){
return 0;
}
int list=matrix[0].length;
int[][] res=new int[line][list];//存放当前位置的最小路径和
for(int i=0;i<line;i++){
//初始化第一列
if(i==0){
res[i][0]=matrix[i][0];
}
else{
res[i][0]=res[i-1][0]+matrix[i][0];
}
}
for(int i=1;i<list;i++){
//初始化第一行
res[0][i]=res[0][i-1]+matrix[0][i];
}
for(int i=1;i<line;i++){
for(int j=1;j<list;j++){
//状态转移方程: F(i,j)=F(i,j)+min(F(i,j-1),F(i-1,j))
res[i][j]=Math.min(res[i-1][j],res[i][j-1])+matrix[i][j];
}
}
return res[line-1][list-1];
}
}