算法训练营day39_动态规划(3.11)
62.不同路径
求(1,1)到(m,n)的方案数;
- f(i,j):从(1,1)到(i,j)的方案数;
- f(i,j)=f(i-1,j)+f(i,j-1);就是从上方来或者从左方来;
- f(1,1)要初始化为1;
- 遍历两层,(1,1)的时候跳过;
class Solution {
public:
int f[110][110];
int uniquePaths(int m, int n) {
memset(f,0,sizeof f);
f[1][1]=1;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(i==1&&j==1) continue;
f[i][j]=f[i-1][j]+f[i][j-1];
}
}
return f[m][n];
}
};
63.不同路径II
跟上题有些不同:
- 起点为(0,0),要注意是否越界;
- 路上有障碍,有障碍的地方不能过;
坑点在于:终点有可能是障碍,刚开始没注意这个;
class Solution {
public:
int f[101][101];
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
memset(f,0,sizeof f);
if(obstacleGrid[obstacleGrid.size()-1][obstacleGrid[0].size()-1]==1) return 0;
f[0][0]=1;
for(int i=0;i<obstacleGrid.size();i++){
for(int j=0;j<obstacleGrid[i].size();j++){
if(i==0&&j==0) continue;
if(obstacleGrid[i][j]==1) continue;
if(i-1>=0&&obstacleGrid[i-1][j]!=1) f[i][j]+=f[i-1][j];
if(j-1>=0&&obstacleGrid[i][j-1]!=1) f[i][j]+=f[i][j-1];
}
}
return f[obstacleGrid.size()-1][obstacleGrid[0].size()-1];
}
};