思路
第一步:定義數組元素的含義
題目的要求的是機器人到達網格的右下角,總共有多少條不同的路徑。因此可將dp
定義爲,當機器人走到(i,j)這個位置時,一共有dp[i][j]
條路徑
第二步:找出關係數組元素間的關係時
機器人要到達右下角,可以往下走,也可以往右走,要到達位置(i,j)
,
一種是從(i-1,j)
這個位置走一步到達
一種是從(i,j-1)
這個位置走一步到達
因爲是要計算所有可能的步驟,所以是把所有可能走的路徑都加起來,所以關係式是dp[i][j]=dp[i-1][j]+dp[i][j-1]
第三步:找出初始值
dp[i][j]
中,如果i或者j有一個爲0,那麼就不能用關係式了,因爲這個時候i-1或者j-1就變成負數了,數組就會出問題,所以我們的初始值是計算出所有的dp[0][0...n-1]
和所有的dp[0...m-1][0]
。這個是非常容易計算的,相當於計算機圖中的最上面一行和左邊一列。因此初始值如下
dp[0] [0….n-1] = 1;
// 相當於最上面一行,機器人只能一直往左走
dp[0…m-1] [0] = 1;
// 相當於最左面一列,機器人只能一直往下走
代碼(自底向上)
class Solution {
public:
int uniquePaths(int m, int n) {
//定義數組元素的含義
vector<vector<int>> dp(m,vector<int>(n));
//初始化
for (int j=0;j<n;j++)//dp[0][j]=dp[0][j-1]
{
dp[0][j] = 1;
}
for (int i=0;i<m;i++)//dp[i][0]=dp[i][0]
{
dp[i][0] = 1;
}
//狀態轉移
for (int i=1;i<m;i++)
{
for (int j=1;j<n;j++)
{
dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
}
}
return dp[m - 1][n - 1];
}
};