题目:有一个矩阵map,它每个格子有一个权值。从左上角的格子开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。给定一个矩阵map及它的行数n和列数m,请返回最小路径和。保证行列数均小于等于100.
思路:典型dp,比较简单,用有一个二维表记录到达每个格子的最小路径,对于第一行和第一列,到达每个格子只可能从一个方向,所以先求第一行,第一列,之后由特殊到一般,对于其他任意的dp[i][j]来说,只有可能从两个方向来的,上或者左,选较小的那个。然后从左到右,从上到下依次求每个格子,最右下角即为所求
public int getMin(int[][] map, int n, int m) {
int[][] dp=new int[n][m];
dp[0][0]=map[0][0];
//第一列
for(int i=1;i<n;i++){
dp[i][0]=map[i][0]+dp[i-1][0];
}
//第一行
for(int i=1;i<m;i++){
dp[0][i]=map[0][i]+dp[0][i-1];
}
for(int i=1;i<n;i++){
for(int j=1;j<m;j++){
dp[i][j]=map[i][j]+Math.min(dp[i][j-1],dp[i-1][j]);
}
}
return dp[n-1][m-1];
}