【LeetCode】62. 不同路徑

思路

第一步:定義數組元素的含義

題目的要求的是機器人到達網格的右下角,總共有多少條不同的路徑。因此可將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];
	}
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章