62.不同路径
这道题我记得之前是用深搜(我到现在自己还没法独立写出,但是用动态规划的话我现在已经回了,其实也就是找出dp[i][j]表示到第i行第j列的路径数量,初始化的话是第一行和第一列都为1,因为到第一行和第一列的点的路径只有1。
https://leetcode.cn/problems/unique-paths/
class Solution {
public:
int uniquePaths(int m, int n) {
int ** maze=new int*[m];
for(int i=0;i<m;i++)
{
maze[i]=new int[n];
}
for(int j=0;j<n;j++)
{
maze[0][j]=1;
}
for(int j=0;j<m;j++)
{
maze[j][0]=1;
}
for(int i=1;i<m;i++)
{
for(int j=1;j<n;j++)
{
maze[i][j]=maze[i-1][j]+maze[i][j-1];
}
}
return maze[m-1][n-1];
}
};
63.不同路径II
这道题一上来我是懵逼的,为啥出来个障碍物,有了障碍物的话怎么办?想清楚这个问题就简单了,障碍物影响初始化,本来第一行和第一列的dp都是等于1,现在有了障碍物,第一行障碍物以及 障碍物右边都为0,(因为没有路可以走到这些点),同理,第一列障碍物以及障碍物下面都为0。当有障碍物时,dp[i][j]=0(就相当于还是初始化0的那个值,不用变),而如果没有障碍物,还是根据dp[i][j]=dp[i-1][j]+dp[i][j-1]计算。(我的代码写的result也就是dp)
https://leetcode.cn/problems/unique-paths-ii/submissions/508506750/
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m=obstacleGrid.size();
int n=obstacleGrid[0].size();
if(obstacleGrid[m-1][n-1]==1||obstacleGrid[0][0]==1)
return 0;
vector<vector<int>>result(m,vector<int>(n,0));
for(int i=0;i<m&&obstacleGrid[i][0]==0;i++)
{
result[i][0]=1;
}
for(int j=0;j<n&&obstacleGrid[0][j]==0;j++)
{
result[0][j]=1;
}
for(int i=1;i<m;i++)
{
for(int j=1;j<n;j++)
{
if(obstacleGrid[i][j]==0)
{
result[i][j]=result[i-1][j]+result[i][j-1];
}
}
}
return result[m-1][n-1];
}
};