【動態規劃】用一維和二維解決不同路徑

LookCoding發表於2020-04-10

宣告:小白總結,本意是記錄自己的思路,不過希望能幫助別人,那就更好啦,若發現問題,歡迎指正,感謝!!
來源:力扣(LeetCode)
連結:62.不同路徑
圖片來自公眾號:小浩演算法

不同路徑

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

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

問總共有多少條不同的路徑?
在這裡插入圖片描述
在這裡插入圖片描述
首先,動態規劃的核心是什麼呢?通俗來說,就是記錄已經解決過的子問題的解。

題目分析

題目要找到達右下角的路徑數,而右下角只能通過上方和左方到達,那麼右下角的路徑數,其實就是它上方的路徑數與左方的路徑數和,以此類推,每一個位置的路徑數都是上方與左方的路徑和,特別地,當處於第一行時,每個位置只能從左方來,即路徑數均為1,當處於第一列時,每個位置只能從上方來,路徑數也為1.

二維動態規劃

// java
class Solution {
    public int uniquePaths(int m, int n) {
        int[][] dp=new int[m][n];
        for(int i=0;i<m;i++){
            dp[i][0]=1;
        }
        for(int j=0;j<n;j++){
            dp[0][j]=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];
    }
}

一維動態規劃(優化)

// java
class Solution {
    public int uniquePaths(int m, int n) {
        int[] dp = new int[n];
        for(int i = 0; i < n; i++){
            dp[i] = 1;
        }
        for(int i = 1; i < m; i++){
            for(int j = 1; j < n; j++){
                dp[j] = dp[j - 1] + dp[j];
            }
        }
        return dp[n - 1];
    }
}

感謝各位巨巨們的幫助,希望在記錄分析題目的條件下演算法能有所提升……
在這裡插入圖片描述

相關文章