💖作者:小树苗渴望变成参天大树
🎉作者宣言:认真写好每一篇博客
🎊作者gitee:gitee
💞作者专栏:C语言,数据结构初阶,Linux,C++ 动态规划算法
如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!
文章目录
- 前言
前言
大家好,今天又来更新一篇关于动态规划的题目,因为这两个题目特别类似,大家也可以试着不看我讲解的,自己使用动态规划的步骤试着解题。
第六个题目是不同路径II
此题只是再前面一题的基础上加了一个障碍物的条件,来看看图解:
这题有了前面那题的基础,有的解释我就不做过多的补充了,接下来用动态规划的步骤给大家讲解:
-
状态表示:经验+题目要求
以i,j位置为结尾,dp[i][j]表示到(i,j)位置有多少种方法 -
状态转移方程:以最近的状态进行分析,到达(i,j)位置时候有多少种方法。
即ob[i][j]=1,有障碍物,dp[i][j]值为0,不用计算
ob[i][j]=0,无障碍物,dp[i][j]值为dp[i-1][j]+dp[i][j-1]; -
初始化:保证数组不越界
通过上题来看,方便初始化,我们弄虚拟节点,多开一行和一列,具体我就不解释了两个注意事项:
(1)虚拟节点的值要保证后面的填表正确,dp[0][1]=1或者dp[1][0]=1;,其余的为0;
(2)下标的映射关系,在填表的时候,循环变量是对标dp表,而dp表的范围比传进来的数组长宽多1,所以对标到传进来的数组的下标的时候,下标要减1,才行 -
填表顺序:从上往下填每一行,每一行从左往右
-
返回值:dp[m][n]
代码实现:
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
//1.创建dp表
//2.初始化
//3.填表
//4/返回值
int m = obstacleGrid.size(), n = obstacleGrid[0].size();
vector<vector<int>> dp(m+1,vector<int>(n+1));
dp[0][1]=1;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
if(obstacleGrid[i-1][j-1]==0)//对标原数组的下标,只要计算无障碍物的位置就行了
dp[i][j]=dp[i-1][j]+dp[i][j-1];
return dp[m][n];
}
};
运行结果:
这题在前面一题的基础上加了一个前提条件,只要分析出来,代码就很简单,重要的就是要掌握做题的方法,才能事半功倍,好了,我们下题再见