日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[dp] LeetCode 62. Unique Paths

發布時間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [dp] LeetCode 62. Unique Paths 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

輸入:兩個int m和n
輸出:一個int,表示不同路徑的個數。
規則:有一個m行n列的矩陣,一個機器人從左上角走到右下角,每次向下或者向右走一格。

分析:目的是要找到從(0,0)到(m-1,n-1)有多少種不同 的走法。如果m=3,n=2。我們按照下圖走一遍。知道有3種走法。先觀察每種走法向下的箭頭都是2個,向右的箭頭都是1個。所以可以得出結論無論哪種走法向右和向下的數量是一定的。向下的數量是m-1,向右的數量是n-1。從(0,0)到(m-1,n-1)要經過m+n-2步。所以這就是一個組合題:Cm+n?2m?1C^{m-1}_{m+n-2}Cm+n?2m?1?

public int uniquePaths(int m, int n) {int a = Math.min(m,n)-1;int b = m+n-2;long p = 1;long q = 1;for(int i=0;i<a;i++){p = p * (b-i);q = q * (i+1);}return (int)(p/q);}

分析2:我們給這個矩陣每個方格用坐標表示(i,j)。

我們用dp[i][j]表示走到坐標(i,j)有多少種走法。
我們自己手畫一下知道dp[1][1]=2,就是有2種路徑到達(1,1)。看圖中能夠到達(1,1)只有可能是從(1,0)或者(0,1)這兩個坐標走過來。那dp[1][1]與dp[1][0]、dp[0][1]是什么關系呢?
實際走一下,知道dp[0][1]=1,dp[1][0]=1,那么dp[1][1]=dp[1][0]+dp[0][1]。為了防止錯誤,再多走幾個格子:dp[2][0]=1,dp[2][1]=dp[2][0]+dp[1][1]。從含義角度講:經過(0,1)點達到(1,1)和經過(1,0)點到達(1,1)的路徑肯定是不相同的,所以用加法不會出錯,也不會計算重復了。所以得到動態方程:
dp[i][j]=dp[i?1][j]+dp[i][j?1]dp[i][j]=dp[i-1][j]+dp[i][j-1]dp[i][j]=dp[i?1][j]+dp[i][j?1]
第0行和第0列的數據需要單獨初始化。

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

參考鏈接

總結

以上是生活随笔為你收集整理的[dp] LeetCode 62. Unique Paths的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。