https://leetcode.cn/problems/unique-paths/
算法思想:
dp[i][j]含義走到i,j有多少種不同的路徑
dp[i][j] = dp[i-1][j] + dp[i][j-1] 走到上方的格的不同路徑和+走到左邊方格不同的路徑和
初始化:上方和左方的格初始化為1.
class Solution {
public:
? ? int uniquePaths(int m, int n) {
? ? ? ? vector<vector<int>> dp(m, vector<int> (n,1));
? ? ? ? //dp[i][j]表示走到i、j有dp[i][j]條路徑
? ? ? ? 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];
? ? }
};
https://leetcode.cn/problems/unique-paths-ii/submissions/
算法思想:
動態規劃。與上一題不同的是,多了障礙物,此時障礙物的格子路徑為0。
class Solution {
public:
? ? int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
? ? ? ? int m =obstacleGrid.size();
? ? ? ? int n = obstacleGrid[0].size();
? ? ? ? vector<vector<int>> dp(m, vector<int> (n));
? ? ? ? int val = 1;
? ? ? ? for(int j=0;j<n;j++)
? ? ? ? {
? ? ? ? ? ? if(obstacleGrid[0][j]==1)
? ? ? ? ? ? ? ? val = 0;
? ? ? ? ? ? dp[0][j] = val;
? ? ? ? }
? ? ? ? val = 1;
? ? ? ? for(int i=0;i<m;i++)
? ? ? ? {
? ? ? ? ? ? if(obstacleGrid[i][0]==1)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? val=0;
? ? ? ? ? ? }
? ? ? ? ? ? dp[i][0] = val;
? ? ? ? }
? ? ? ? for(int i=1;i<m;i++)
? ? ? ? {
? ? ? ? ? ? for(int j=1;j<n;j++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if(obstacleGrid[i][j]==1)
? ? ? ? ? ? ? ? ? ? dp[i][j] = 0;
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? dp[i][j] = dp[i-1][j] + dp[i][j-1];
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return dp[m-1][n-1];
? ? }
};