新四季網

動態規划算法求最小路徑(動態規劃求不同路徑)

2023-08-06 17:30:48

問題描述

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

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

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

例如,上圖是一個7 x 3 的網格。有多少可能的路徑?

示例 1:

輸入: m = 3, n = 2

輸出: 3

解釋:

從左上角開始,總共有 3 條路徑可以到達右下角。

1. 向右 -> 向右 -> 向下

2. 向右 -> 向下 -> 向右

3. 向下 -> 向右 -> 向右

示例 2:

輸入: m = 7, n = 3

輸出: 28

提示:

1 <= m, n <= 100題目數據保證答案小於等於 2 * 10 ^ 9動態規劃解決

注意這裡機器人只能向下和向右移動,不能往其他方向移動,我們用dp[i][j]表示到坐標(i,j)這個格內有多少條不同的路徑,所以最終的答案就是求dp[m-1][n-1]。

因為只能從上面或左邊走過來,所以遞推公式是

dp[i][j]=dp[i-1][j] dp[i][j-1]。dp[i-1][j]表示的是從上面走過來的路徑條數。

dp[i][j-1]表示的是從左邊走過來的路徑條數。

那麼邊界條件是什麼呢,如果Finish在第一行的任何位置都只有一條路徑,同理Finish在第一列的任何位置也都只有一條路徑,所以邊界條件是第一行和第一列都是1。我們已經找到了遞推公式,又找到了邊界條件,所以動態規劃代碼很容易寫出來,我們來看下

publicintuniquePaths(intm,intn){int[][]dp=newint[m][n];//第一列都是1for(inti=0;i<m;i ){dp[i][0]=1;}//第一行都是1for(inti=0;i<n;i ){dp[0][i]=1;}//這裡是遞推公式for(inti=1;i<m;i )for(intj=1;j<n;j )dp[i][j]=dp[i-1][j] dp[i][j-1];returndp[m-1][n-1];}

動態規劃優化

我們看上面二維數組的遞推公式,當前坐標的值只和左邊與上面的值有關,和其他的無關,這樣二維數組造成大量的空間浪費,所以我們可以把它改為一維數組。

publicintuniquePaths(intm,intn){int[]dp=newint[m];Arrays.fill(dp,1);for(intj=1;j<n;j )for(inti=1;im||j>n)return0;if((i==m&&j==n))return1;//從右邊走有多少條路徑intright=uniquePathsHelper(i 1,j,m,n);//從下邊走有多少條路徑intdown=uniquePathsHelper(i,j 1,m,n);//返回總的路徑returnright down;}

代碼中有注釋,很容易理解,但其實這種效率很差,因為他包含了大量的重複計算,我們畫個圖來看一下。

我們看到上面圖中紅色,黑色,還有那種什麼顏色的都表示重複的計算,所以有一種方式就是把計算過的值使用一個map存儲起來,用的時候先查看是否計算過,如果計算過就直接拿來用,看下代碼

publicintuniquePaths(intm,intn){returnuniquePathsHelper(1,1,m,n,newHashMap);}publicintuniquePathsHelper(inti,intj,intm,intn,Mapmap){if(i>m||j>n)return0;if((i==m&&j==n))return1;Stringkey=i "*" j;if(map.containsKey(key)) returnmap.get(key);intright=uniquePathsHelper(i 1,j,m,n,map);intdown=uniquePathsHelper(i,j 1,m,n,map);inttotla=right down;map.put(key,totla);returntotla;}

使用公式計算

我們要想到達終點,需要往下走n-1步,往右走m-1步,總共需要走n m-2步。他無論往右走還是往下走他的總的步數是不會變的。也就相當於總共要走n m-2步,往右走m-1步總共有多少種走法,很明顯這就是一個排列組合問題,公式如下

排列組合的計算公式如下

公式為(m n-2)! / [(m-1)! * (n-1)!]

代碼如下

publicintuniquePaths(intm,intn){intN=n m-2;doubleres=1;for(inti=1;i<m;i )res=res*(N-(m-1) i)/i;return(int)res;}

總結

這題使用動態規劃是最容易理解也是最容易解決的,當然後面的遞歸和公式計算也能解決。

如果喜歡這篇文章還可以關注微信公眾號「數據結構和算法」,查看更多的算法題

,
同类文章
葬禮的夢想

葬禮的夢想

夢見葬禮,我得到了這個夢想,五個要素的五個要素,水火只好,主要名字在外面,職業生涯良好,一切都應該對待他人治療誠意,由於小,吉利的冬天夢想,秋天的夢是不吉利的
找到手機是什麼意思?

找到手機是什麼意思?

找到手機是什麼意思?五次選舉的五個要素是兩名士兵的跡象。與他溝通很好。這是非常財富,它擅長運作,職業是仙人的標誌。單身男人有這個夢想,主要生活可以有人幫忙
我不怎麼想?

我不怎麼想?

我做了什麼意味著看到米飯烹飪?我得到了這個夢想,五線的主要土壤,但是Tu Ke水是錢的跡象,職業生涯更加真誠。他真誠地誠實。這是豐富的,這是夏瑞的巨星
夢想你的意思是什麼?

夢想你的意思是什麼?

你是什​​麼意思夢想的夢想?夢想,主要木材的五個要素,水的跡象,主營業務,主營業務,案子應該抓住魅力,不能疏忽,春天夢想的吉利夢想夏天的夢想不幸。詢問學者夢想
拯救夢想

拯救夢想

拯救夢想什麼意思?你夢想著拯救人嗎?拯救人們的夢想有一個現實,也有夢想的主觀想像力,請參閱週宮官方網站拯救人民夢想的詳細解釋。夢想著敵人被拯救出來
2022愛方向和生日是在[質量個性]中

2022愛方向和生日是在[質量個性]中

[救生員]有人說,在出生88天之前,胎兒已經知道哪天的出生,如何有優質的個性,將走在什麼樣的愛情之旅,將與生活生活有什么生活。今天
夢想切割剪裁

夢想切割剪裁

夢想切割剪裁什麼意思?你夢想切你的手是好的嗎?夢想切割手工切割手有一個真正的影響和反應,也有夢想的主觀想像力。請參閱官方網站夢想的細節,以削減手
夢想著親人死了

夢想著親人死了

夢想著親人死了什麼意思?你夢想夢想你的親人死嗎?夢想有一個現實的影響和反應,還有夢想的主觀想像力,請參閱夢想世界夢想死亡的親屬的詳細解釋
夢想搶劫

夢想搶劫

夢想搶劫什麼意思?你夢想搶劫嗎?夢想著搶劫有一個現實的影響和反應,也有夢想的主觀想像力,請參閱週恭吉夢官方網站的詳細解釋。夢想搶劫
夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂什麼意思?你夢想缺乏異常藥物嗎?夢想缺乏現實世界的影響和現實,還有夢想的主觀想像,請看官方網站的夢想組織缺乏異常藥物。我覺得有些東西缺失了