题目
Minimum Path Sum(路线上元素和的最小值);
给定一个m行n列的矩阵,从左上角到右下角所有可能的路径中,求经过的元素和最小值。
分析
动态规划
dp[i][j]表示从i,j的位置到右下角的位置的所有可能路径中,经过的元素和的最小值;
则状态转移方程:
dp[i][j]=min{dp[i+1][j],dp[i][j+1]}+a[i][j];
初始化:
dp[m-1][n-1]=a[m-1][n-1]]
dp[i][n-1]=dp[i+1][n-1]+a[i][n-1]
dp[m-1][j]=dp[m-1][j+1]+a[m-1][j]
实现
public class minimum_path_sum {
/**
* @param args
*/
public static void main(String[] args) {
int[][] grid={
{1,2},
{1,1}
};
int res=minPathSum(grid);
System.out.println(res);
}
/*
* 方法1:
* dp[i][j]表示从i,j到m-1,n-1的路径的sum max
* dp[i][j]=min{dp[i+1][j],dp[i][j+1]}+a[i][[j]
*
* 方法2:
* dp[i][j]表示从0,0到i,j的路径的sum max
* dp[i][j]=min{dp[i-1][j],dp[i][j-1]}+a[i][j]
*/
public static int minPathSum(int[][] grid){
if(grid==null){
return 0;
}
int m=grid.length;
int n=grid[0].length;
int[][] dp=new int[m][n];
dp[m-1][n-1]=grid[m-1][n-1];
//第n-1列
for(int i=m-2;i>=0;i--){
dp[i][n-1]=dp[i+1][n-1]+grid[i][n-1];
}
//第m-1行
for(int j=n-2;j>=0;j--){
dp[m-1][j]=dp[m-1][j+1]+grid[m-1][j];
}
for(int i=m-2;i>=0;i--){
for(int j=n-2;j>=0;j--){
dp[i][j]=Math.min(dp[i+1][j],dp[i][j+1])+grid[i][j];
}
}
return dp[0][0];
}
}