LintCode_114 不同的路径,115 不同的路径 II
题目
有一个机器人的位于一个M×N个网格左上角(下图中标记为'Start')。
机器人每一时刻只能向下或者向右移动一步。机器人试图达到网格的右下角(下图中标记为'Finish')。
问有多少条不同的路径?
注意事项
n和m均不超过100
样例
1,1 | 1,2 | 1,3 | 1,4 | 1,5 | 1,6 | 1,7 |
2,1 | ||||||
3,1 | 3,7 |
以上3 x 7的网格中,有多少条不同的路径?
思路
dp的思路来解决
dp[0][j] = 1;
dp[i][0] = 1;
dp[i][j] = dp[i-1][j] + dp[i][j-1];
空间复杂度可以降低到O(n)
dp[i] = dp[i] + dp[i-1];
C++代码
1 int uniquePaths(int m, int n) { 2 // wirte your code here 3 vector<int> dp(n,1); 4 for(int i = 1; i < m; ++i) 5 { 6 for(int j = 1; j < n; ++j) 7 { 8 dp[j] += dp[j - 1]; 9 } 10 } 11 return dp[n - 1]; 12 }
不同的路径 II
题目
"不同的路径" 的跟进问题:
现在考虑网格中有障碍物,那样将会有多少条不同的路径?
网格中的障碍和空位置分别用 1 和 0 来表示。
注意事项
m 和 n 均不超过100
样例
如下所示在3x3的网格中有一个障碍物:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
一共有2条不同的路径从左上角到右下角。
思路
和前面差不多
if(s[i - 1][j] == 0 && s[i][j - 1] == 1) dp[i][j] = dp[i - 1][j];
if(s[i][j - 1] == 0 && s[i - 1][j] == 1) dp[i][j] = dp[i][j - 1];
else if(s[i - 1][j] == 0 && s[i][j - 1] == 0) dp[i][j] = 0;
else if(s[i - 1][j] == 1 && s[i][j - 1] == 1) dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
C++代码
1 int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) { 2 // write your code here 3 int m = obstacleGrid.size(); 4 int n = obstacleGrid[0].size(); 5 6 vector<vector<int> > dp(m,vector<int>(n, 0)); 7 for(int i = 0; i < m; ++i) 8 { 9 for(int j = 0; j < n; ++j) 10 { 11 if(i == 0 && j == 0) dp[i][j] = 1; 12 else if(i == 0) 13 { 14 dp[i][j] = dp[i][j - 1]; 15 } 16 else if(j == 0) 17 { 18 dp[i][j] = dp[i - 1][j]; 19 } 20 else if(obstacleGrid[i][j] != 1) 21 { 22 dp[i][j] = dp[i-1][j] + dp[i][j-1]; 23 } 24 if(obstacleGrid[i][j] == 1) 25 { 26 dp[i][j] = 0; 27 } 28 } 29 } 30 return dp[m-1][n-1]; 31 }