1. 不同路径
题目链接:
62. 不同路径 - 力扣(LeetCode)https://leetcode.cn/problems/unique-paths/description/
2. 算法原理
1. 状态表示:以莫一个位置为结尾
dp[i]表示:以[i,j]位置为结尾时,解码方法的总数
dp[i,j]表示:走到[i,j]位置的时候一共有多少种方法
2. 状态转移方程
根据最近的一步来划分问题:
到达dp[i][j]有两种情况:
1. 从上面过来:dp[i-1,j] -> dp[i,j],dp[i-1,j]
2. 从左边过来:dp[i,j-1] -> dp[i,j],dp[i,j-1]
之所以这里是dp[i-1,j]而不是dp[i-1,j]+1是因为这里的+1是dp[i-1,j]到dp[i,j]的一步,而不是一种方法
本题的状态转移方程是:dp[i][j] = dp[i-1,j] + dp[i,j-1]
3. 初始化 :把dp表填满不越界,让后面的填表可以顺利进行
根据状态转移方程来初始化的话是需要dp[i-1,j] 和 dp[i,j-1]来确定要初始化位置值,但是我们整个矩阵的上面的一行和左边的一列是不符合这个情况的,所以我们可以在上面的一行和左边的一列再额外的加上一行和一列的虚拟节点
那个虚拟位置为1是因为上面的值加上左边的值就可以得到原来第一个位置的值,再按照上面的值加上左边的值来计算其他位置的值
4. 填表顺序
本题的填表顺序是:从上往下填写每一行,每一行的值是从左往右
5. 返回值 :题目要求 + 状态表示
本题的返回值是:dp[m][n]
3.代码
动态规划的固定四步骤:1. 创建一个dp表
2. 在填表之前初始化
3. 填表(填表方法:状态转移方程)
4. 确定返回值
class Solution {
public:
int uniquePaths(int m, int n) {
//创建dp表二维数组
vector<vector<int>>dp(m+1,vector<int>(n+1));
//只用初始化[0][1]为1,其他会默认初始化为0
dp[0][1]=1;
//从上往下填写每一行,每一行的值是从左往右
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
dp[i][j]=dp[i-1][j]+dp[i][j-1];
return dp[m][n];
}
};
完结撒花~