1. 程式人生 > 其它 >動態規劃A計數問題

動態規劃A計數問題

技術標籤:演算法動態規劃java

動態規劃A計數問題

接下來用一道例題來認識動態規劃的計數問題,首先宣告一下,這些題可能有其他解法,但在這裡我只是說一說關於動態規劃的解法。

開始吧!

62. 不同路徑

題目地址

一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。

機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。

問總共有多少條不同的路徑?

141-1

例如,上圖是一個7 x 3 的網格。有多少可能的路徑?

示例1:

輸入: m = 3, n = 2
輸出: 3
解釋:從左上角開始,總共有 3 條路徑可以到達右下角。

  1. 向右 -> 向右 -> 向下
  2. 向右 -> 向下 -> 向右
  3. 向下 -> 向右 -> 向右

示例2:

輸入: m = 7, n = 3
輸出: 28

提示:

  • 1 <= m, n <= 100
  • 題目資料保證答案小於等於 2 * 1 0 9 10 ^ 9 109

begin

題目描述得很清楚了,你是否有了想法,建議先嚐試一下,考慮用動態規劃怎麼解。

動態規劃

A 計數問題 B 最值問題 C 可行性問題

一、確定狀態

  1. 最後一步
  2. 子問題

二、轉移方程

三、初始條件和邊界問題

初始條件:用轉移方程算不出來,需要手工定義
邊界情況:陣列不能越界

四、計算順序

A計數問題

很明顯這是一個關於計數的問題,題目要求解的是機器人有多少種方案走到右下角,而不是要求這些方案裡是怎樣走到右下角的,這就是動態規劃的一個標誌吧,不要過程要結果。

按照上面的順序來:

一、確定狀態

  1. 最後一步

我們假設機器人走了最後一步到達終點,也只有兩種可能,從上方向下走,從左方向右走。即從(m-2,n-1)或(m-1,n-2)走到了終點(m-1,n-1)。

  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];
    }
}

應該都能看懂吧。

詳細題解

推薦視訊

動態規劃入門