[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?。
分析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[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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 代码托管使用指南
- 下一篇: 联想拯救者R720黑苹果EFI分享