不同路径 II

74 阅读1分钟

image.png

采用动态规划的方法,到达一个坐标点只有向下和向右两个方向,只要前一个点和到达点都不为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的值
    }
};