告别动态规划,连刷40道动规算法题,我总结了动规的套路-CSDN博客
今日粪场悟道习得动态规划,昔日总感犹如登天,今日细观不过尔尔。
后日国赛,敬请期待
不同路径,当前路径为上一层路径数加左边路径数
dp[i][j]=dp[i-1][j]+dp[i][j-1];
class Solution {
public:
int uniquePaths(int m, int n) {
int dp[m][n];
dp[0][0]=1;
for(int i=1;i<m;i++)
dp[i][0]=1;
for(int i=1;i<n;i++)
dp[0][i]=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-1][n-1];
}
};
新增障碍,很恶心啊(起点终点为障碍),规避其实很简单
从上往下有障碍以后剩下的皆为0,从左至右也是
加入dp以后障碍设为零即可
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m=obstacleGrid.size();
int n=obstacleGrid[0].size();
int dp[m][n];
dp[0][0]=obstacleGrid[0][0];
for(int i=0;i<m;i++)
{
if(obstacleGrid[i][0]==0) dp[i][0]=1;
else
{
for(int j=i;j<m;j++)
dp[j][0]=0;
break;
}
}
for(int j=0;j<n;j++)
{
if(obstacleGrid[0][j]==0) dp[0][j]=1;
else
{
for(int i=j;i<n;i++)
{
dp[0][i]=0;
}
break;
}
}
for(int i=1;i<m;i++)
for(int j=1;j<n;j++)
{
if(obstacleGrid[i][j]==1)
{
dp[i][j]=0;
continue;
}
else
{
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
return dp[m-1][n-1];
}
};