前言
这里记录一下陈菜菜的刷题记录,主要应对25秋招、春招
个人背景
211CS本+CUHK计算机相关硕,一年车企软件开发经验
代码能力:有待提高
常用语言:C++
系列文章目录
第38天 :第九章 动态规划part02
`
文章目录
- 前言
- 系列文章目录
- 第38天 :第九章 动态规划part02
- 一、今日任务
- 二、详细布置
- 62.不同路径
- 提示:
- 样例1:
- 思路
- 实战
- 踩坑
- 63. 不同路径 II
- 提示:
- 样例1:
- 思路
- 实战
- 踩坑
- 总结
一、今日任务
● 62.不同路径
● 63.不同路径II
二、详细布置
62.不同路径
题目链接:力扣62
文章讲解:代码随想录
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
提示:
1<= m, n <= 100
题目数据保证答案小于等于 2 * 109
样例1:
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下]
思路
这题相当于二维的跳楼梯,思路是一样的。
实战
class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m+1,vector<int>(n+1,0));dp[0][0]=0;dp[1][0]=1;dp[1][0]=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];}
};
踩坑
二维vector的初始化:vector<vector<int>> dp(m+1,vector<int>(n+1,0));
63. 不同路径 II
题目链接:力扣63题链接
文章讲解:图文讲解
给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角(即 grid[0][0])。机器人尝试移动到 右下角(即 grid[m - 1][n - 1])。机器人每次只能向下或者向右移动一步。
网格中的障碍物和空位置分别用 1 和 0 来表示。机器人的移动路径中不能包含 任何 有障碍物的方格。
返回机器人能够到达右下角的不同路径数量。
测试用例保证答案小于等于 2 * 109。
提示:
m == obstacleGrid.length
n == obstacleGrid[i].length
1 <= m, n <= 100
obstacleGrid[i][j] 为 0 或 1
样例1:
输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右
思路
这题和上一题类似,但是不同的是这题要根据障碍物先把边界全找出来,有障碍物的地方如果在第一行或第一列,障碍物后的第一行/第一列的所有点都到不了。
实战
class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m=obstacleGrid.size(),n=obstacleGrid[0].size();vector<vector<int>> dp(m,vector<int>(n,0));if(obstacleGrid[0][0]==1||obstacleGrid[m-1][n-1]==1)return 0;for(int i=0;i<m && obstacleGrid[i][0]==0;i++){dp[i][0]=1;}for(int i=0;i<n && obstacleGrid[0][i]==0;i++){dp[0][i]=1;}for(int i=1;i<m;i++){for(int j=1;j<n;j++){if(obstacleGrid[i][j]==1)continue;dp[i][j]=dp[i-1][j]+dp[i][j-1];}}return dp[m-1][n-1];}
};
踩坑
如果起点或终点有障碍物,那一定到不了,返回0
总结
今天主要学习了dp的一系列操作,今天难度不大,有点dp那味儿了
加油,坚持打卡的第38天。