動態規劃A計數問題
阿新 • • 發佈:2021-01-06
動態規劃A計數問題
接下來用一道例題來認識動態規劃的計數問題,首先宣告一下,這些題可能有其他解法,但在這裡我只是說一說關於動態規劃的解法。
開始吧!
62. 不同路徑
一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。
機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。
問總共有多少條不同的路徑?
例如,上圖是一個7 x 3 的網格。有多少可能的路徑?
示例1:
輸入: m = 3, n = 2
輸出: 3
解釋:從左上角開始,總共有 3 條路徑可以到達右下角。
- 向右 -> 向右 -> 向下
- 向右 -> 向下 -> 向右
- 向下 -> 向右 -> 向右
示例2:
輸入: m = 7, n = 3
輸出: 28
提示:
- 1 <= m, n <= 100
- 題目資料保證答案小於等於 2 * 1 0 9 10 ^ 9 109
begin
題目描述得很清楚了,你是否有了想法,建議先嚐試一下,考慮用動態規劃怎麼解。
動態規劃
A 計數問題 B 最值問題 C 可行性問題
一、確定狀態
- 最後一步
- 子問題
二、轉移方程
三、初始條件和邊界問題
初始條件:用轉移方程算不出來,需要手工定義
邊界情況:陣列不能越界
四、計算順序
A計數問題
很明顯這是一個關於計數的問題,題目要求解的是機器人有多少種方案走到右下角,而不是要求這些方案裡是怎樣走到右下角的,這就是動態規劃的一個標誌吧,不要過程要結果。
按照上面的順序來:
一、確定狀態
- 最後一步
我們假設機器人走了最後一步到達終點,也只有兩種可能,從上方向下走,從左方向右走。即從(m-2,n-1)或(m-1,n-2)走到了終點(m-1,n-1)。
- 子問題
根據最後一步,我們把終點換了個位置,即上方的(m-2,n-1)和(m-1,n-2),並且到這兩點之和作為結果。很明顯是將一個大問題變成一個規模更小的問題了,所以這個就是子問題。
二、轉移方程
f[i][j]=f[i-1][j]+f[i][j-1]。
三、初始條件和邊界問題
出發點f[0][0]=1,最上一層和最左一層都是隻有一條路。
四、計算順序
二維陣列更注重順序,要清楚我們要求的所有條件都在上一步求出了。
一種java題解
class Solution {
public int uniquePaths(int m, int n) {
int[][] dp=new int[n][m];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(i==0||j==0){
dp[i][j]=1;
}else{
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
}
return dp[n-1][m-1];
}
}
應該都能看懂吧。