伍六七带你学算法 动态规划 ——不同路径
力扣 62. 不同路徑
難度 中等
一個(gè)機(jī)器人位于一個(gè) m x n 網(wǎng)格的左上角 (起始點(diǎn)在下圖中標(biāo)記為“Start” )。
機(jī)器人每次只能向下或者向右移動(dòng)一步。機(jī)器人試圖達(dá)到網(wǎng)格的右下角(在下圖中標(biāo)記為“Finish”)。
問(wèn)總共有多少條不同的路徑?
例如,上圖是一個(gè)7 x 3 的網(wǎng)格。有多少可能的路徑?
示例 1:
輸入: m = 3, n = 2
輸出: 3
解釋:
從左上角開(kāi)始,總共有 3 條路徑可以到達(dá)右下角。
1 向右 -> 向右 -> 向下
2 向右 -> 向下 -> 向右
3 向下 -> 向右 -> 向右
示例 2:
輸入: m = 7, n = 3
輸出: 28
提示:
1 <= m, n <= 100
題目數(shù)據(jù)保證答案小于等于 2 * 10 ^ 9
來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/unique-paths
本題是一個(gè)有關(guān)動(dòng)態(tài)規(guī)劃的題目,首先,動(dòng)態(tài)規(guī)劃最重要的是掌握他的思想,動(dòng)態(tài)規(guī)劃的核心思想是把原問(wèn)題分解成子問(wèn)題進(jìn)行求解,也就是分治的思想。
本題中m×n的表格中機(jī)器人一定會(huì)走m+n-2步,即從m+n-2中挑出m-1步向下走不就行了嗎?即C((m+n-2),(m-1))。
C(m,n)是數(shù)學(xué)公式
C(m,n)=m×(m-1)×……×(m-n+1)/n×(n-1)^……3×2×1
C(10,3)=10×9×8/3×2×1
到了本題上這樣計(jì)算是不是根本不懂怎么用這個(gè)公式??
那么我這么說(shuō),你應(yīng)該就懂了→重點(diǎn)!
1.從第一個(gè)格子開(kāi)始,我們每一個(gè)格子計(jì)算到這個(gè)格子的路徑數(shù)
2.每一個(gè)格子的路徑數(shù)就等于它上面格子和左邊格子路徑的和
3.第一行和第一列的格子路徑數(shù)都為1
最后,我們只需要拿到最后一個(gè)格子的路徑返回即可!
上代碼👇
public class _62_不同路徑 {public static int uniquePaths(int m, int n) {int [][]dp = new int[m][n];for(int i = 0;i<m;i++){for(int j = 0;j<n;j++){if(j==0||i==0){dp[i][j]=1;}else{dp[i][j]=dp[i][j-1]+dp[i-1][j];}}}return dp[m-1][n-1];}public static void main(String[] args) {System.out.println(uniquePaths(7,3));}
}
數(shù)組只用到上一個(gè)狀態(tài),因此可以只用一個(gè)一維數(shù)組,優(yōu)化空間復(fù)雜度
public class _62_不同路徑 {public static int uniquePaths(int m, int n) {int[] dp = new int[n+1];for(int i = 0; i < m; i++){for(int j = 1; j <= n; j++){if(dp[j-1] == 0){ //邊界dp[j] = 1;}else{ //狀態(tài)轉(zhuǎn)移方程dp[j] = dp[j-1] + dp[j];}}}return dp[n];}public static void main(String[] args) {System.out.println(uniquePaths(7,3));}
}
總結(jié)
以上是生活随笔為你收集整理的伍六七带你学算法 动态规划 ——不同路径的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 伍六七带你学算法 入门篇——最后一个单词
- 下一篇: 伍六七带你学算法——被忽视的数学公式