💖作者:小树苗渴望变成参天大树
🎉作者宣言:认真写好每一篇博客
🎊作者gitee:gitee
💞作者专栏:C语言,数据结构初阶,Linux,C++ 动态规划算法
如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!
文章目录
- 前言
前言
今天博主来更新动态规划算法的第五题了,相比较前面的两题,这个题目还是比较容易理解的,题目看上去难,但是用动态规划就特别容易,我们一起来进入讲解吧
第五个题目是不同路径
图解:
这题理解起来不难,我直接用动态规划的步骤给大家讲解:
-
状态表示:经验+题目要求
因为这是一个二维图形了,又有横坐标,又有竖坐标,所以一个变量是不够的,以(i,j)位置为结尾,dp[i][j]表示:从起点到(i,j)位置的有多少种方法 -
状态转移方程:以最近位置的状态来算当前位置的状态
根据图解状态转移方程为dp[i][j]==dp[i-1][j]+dp[i][j-1]; -
初始化:保证数组不越界
我们只需要多开辟一行和一列,作为虚拟节点就可以解决初始化繁琐的是 -
填表顺序:从下往下写每一行,每一行从左往右
-
返回值:根据上面的图解:下标的映射关系,返回dp[m][n];
代码实现:
class Solution {
public:
int uniquePaths(int m, int n) {
//1.创建dp表
vector<vector<int>> dp (m+1,vector<int>(n+1));//多创建一行一列,为了把初始化工作放在填表里面
//2.初始化
dp[1][0]=1;
//3.填表顺序
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];
//4返回值
return dp[m][n];
}
};
运行结果:
今天的题目就讲解完毕了,把上一题的处理边界及初始化问题再次使用到了,题目理解了就不难,希望大家下去可以学会这种做题的方法,我们下题再见