动态规划解题步骤:
1.确定状态表示:dp[i]是什么
2.确定状态转移方程:dp[i]等于什么
3.初始化:确保状态转移方程不越界
4.确定填表顺序:根据状态转移方程即可确定填表顺序
5.确定返回值
题目链接:LCR 099. 最小路径和 - 力扣(LeetCode)
题解:
1.状态表示: dp[i][j]表示到达网格[i][j]位置的最小路径和
2.状态转移方程:dp[i][j]=grid[i-1][j-1]+min(dp[i-1][j],dp[i][j-1])
3.初始化:多开一行一列,初始化和填表合并(多开位置需要填值:[0][1]和[1][0]位置填0,其余位置为正无穷)
4.填表顺序:遍历二维数组,依次填写
5.返回值:dp[m][n] (m为网格行数,n为网格列数)
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
size_t m=grid.size();
size_t n=grid[0].size();
//创建dp表
vector<vector<int>> dp(m+1,vector<int>(n+1,INT_MAX));
//多开位置填值(二维数组[0,1][1,0]位置为0,其余为正无穷,在创建dp表时将所有位置都初始化为正无穷)
//(这样多开位置只需填0即可,其余位置填表时会被新数据覆盖)
dp[0][1]=dp[1][0]=0;
//填表
for(int i=1;i<m+1;++i)
for(int j=1;j<n+1;++j)
dp[i][j]=grid[i-1][j-1]+min(dp[i-1][j],dp[i][j-1]);
return dp[m][n];
}
};
//dp[i][j]=grid[i-1][j-1]+min(dp[i-1][j],dp[i][j-1])