采用动态规划的方法,到达一个坐标点只有向下和向右两个方向,只要前一个点和到达点都不为1,即都可走到,我们则可知能到上一个点的也能通过向下或享向右到达这个点,所以到达(m-1,n-1)的方法数等于从左点和上点的方法数之和。所有问题划分为关于左点方法数和上点方法数的子问题,直到划分到初始点(0,0),如果(0,0)是障碍点,则不可走,返回0,否则初始化为1。
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int i=0,j=0;int m=obstacleGrid.size(),n=obstacleGrid[0].size();
vector<vector<int>> dp(m, vector<int>(n,0));
if(obstacleGrid[0][0]==0) dp[0][0]=1;
else return 0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(i-1>=0&&obstacleGrid[i][j]==0&&obstacleGrid[i-1][j]==0) dp[i][j]+=dp[i-1][j];
if(j-1>=0&&obstacleGrid[i][j]==0&&obstacleGrid[i][j-1]==0) dp[i][j]+=dp[i][j-1];
}
}
return dp[m-1][n-1];
}
};
动态规划基本模版
class Solution {
public:
int run(int n) {
if(n==1) return 1;//最小子问题
if(n==2) return 2;
vector<int> dp(n+1,0);//状态定义
dp[1]=1;dp[2]=2;//初始化
for(int i=3;i<n+1;i++){
dp[i]=dp[i-1]+dp[i-2];//状态达到条件转移
//如果是求极值
//dp[i]=max/min(dp[i-1]+1,dp[i-2]+2);
}
return dp[n];//返回对应输入n的值
}
};