不同路徑Ⅰ和Ⅱ,這兩題做法差不多,就直接記錄在一起了。
就是兩道基礎DP,據說面試DP考的挺多的,特意來找找感覺。
這兩題都很基礎很簡單。
首先第一題不同路徑Ⅰ
- ①dp[i][j]表示走到gicd[i][j]這裏的總路徑數。
- ②因爲每個格子只能由上面的格子或者左邊的格子移過來。所以可以很容易寫下這樣的式子dp[i][j] = dp[i-1][j] + dp[i][j-1];
- ③初始化考慮上面的式子i和j不能等於0,於是就想到了最上面一行和最左邊一列需要初始化。
接下來擼代碼就好了
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> dp(m, vector<int>(n));//正在剛c++primer剛學到的,不得不試一下
for(int i=0; i<m; ++i) dp[i][0] = 1;//初始化
for(int i=0; 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];
}
};
接下來第二題,跟上題幾乎一毛一樣,思路不累贅了。
直接擼代碼
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size(), n=obstacleGrid[0].size();
vector<vector<long>> dp(m, vector<long>(n,0));
for(int i=0; i<m; i++){
if(obstacleGrid[i][0]==1) break;
dp[i][0]=1;
}
for(int i=0; i<n; i++){
if(obstacleGrid[0][i]==1) break;
dp[0][i]=1;
}
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];
}
};
這裏得用long不然會爆int,奇怪了上題int都沒問題,數據範圍給的一樣,照理說下面這題應該更小纔對,letcode數據確實有點水。