一、问题描述
二、解题思路
这个题目是典型的动态规划问题,只能从左上角开始,往右或者往下移动。
1.dp数组的初始化:
第一行:设置行总花费变量,每往右走一个格把当前格的花费Cost加到总花费中,总花费就是当前格的最小花费。
第一列:设置列总花费变量,每往下走一个格把当前格的花费Cost加到总花费中,总花费就是当前格的最小花费。
2.状态转移方程:
设当前在第[i][j]位置,从左上角到当前位置的总花费=下面两者较小值 加上当前格花费cost
2.1 从左侧格[i][j-1]往右走
2.2 从上侧格[i-1][j]往下走
即:dp[i][j] = Min(dp[i][j-1],dp[i-1][j])+cost
三、代码实现
java
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param matrix int整型二维数组 the matrix
* @return int整型
*/
public int minPathSum (int[][] matrix) {
// 这个题目是典型的动态规划问题
int rowLen=matrix.length;
int colLen=matrix[0].length;
int[][] dpMatrix=new int[rowLen][colLen];
//初始化dpMatrix
int colCost=0;
for(int col=0;col<colLen;col++){//初始化第0行
colCost+=matrix[0][col];
dpMatrix[0][col]=colCost;
}
int rowCost=0;
for(int row=0;row<rowLen;row++){//初始化第0列
rowCost+=matrix[row][0];
dpMatrix[row][0]=rowCost;
}
//每次只能向右或者向下移动
for(int row=1;row<rowLen;row++){
for(int col=1;col<colLen;col++){
int downCost=dpMatrix[row-1][col]+matrix[row][col];
int rightCost=dpMatrix[row][col-1]+matrix[row][col];
dpMatrix[row][col]=Math.min(downCost,rightCost);
}
}
return dpMatrix[rowLen-1][colLen-1];
}
}