LeetCode62-不同路徑-動態(tài)規(guī)劃

題目描述

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

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

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

圖表
示例 1:

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

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

提示:
1 <= m, n <= 100
題目數(shù)據(jù)保證答案小于等于 2 * 10 ^ 9

思路分析

動態(tài)規(guī)劃三步:

  • 第一步找到dp數(shù)組的定義,我們可以定義dp[i][j]表示從(0,0)坐標點出發(fā)到達坐標點(i,j)的所有路徑,對于mn列的所有路徑就是dp[m-1][n-1]的值;
  • 第二步是找到數(shù)組元素之間的關系。首先考慮第一行和第一列的情況,因為只能向下和向右,第一行只能一直向右走,第一列只能向下走(不能向左或向上),所以dp[0][i]dp[j][0]的值為1;針對于中間的坐標點(i,j),i>0,j>0有兩個方向可以到達,一個方向是(i-1,j),一個方向是(i,j-1),分別從它上邊和左邊,所以我們可以得到關系:dp[i][j]=dp[i-1][j]+dp[i][j-1],i>0,j>0
  • 第三步找到初始值,在第二步的時候我們已經(jīng)知道了第一行和第一列的值為1;

代碼實現(xiàn)

public class Solution62 {
    public int uniquePaths(int m, int n) {
        //`dp[i][j]`表示從`(0,0)`坐標點出發(fā)到達坐標點`(i,j)`的所有路徑
        int[][] dp = new int[m][n];
        ///第一行
        for (int i = 0; i < n; i++) {
            dp[0][i] = 1;
        }
        ///第一列
        for (int i = 0; i < m; i++) {
            dp[i][0] = 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];
    }

    public static void main(String[] args) {
        Solution62 solution62 = new Solution62();
        System.out.println("res:" + solution62.uniquePaths(3, 2));
        System.out.println("res:" + solution62.uniquePaths(7, 3));
    }
}

歡迎關注南閣公眾號

南閣子也
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容