尋找一條從陣列左上角arr[0][0]到右下角arr[m-1][n-1]的路線,使得沿線經過陣列的數值之和最小。
遞迴法倒著來分析:最後一步到達arr[m-1][n-1]只有兩條路,即通往arr[m-2][n-1]到達或者通往arr[m-1][n-2]到達,最後一步選擇的路線為min
,同理可遞迴選擇到arr[m-2][n-1]或arr[m-1][n-2]的路徑。這種遞迴方法效率太低,因為裡面有大量的重複計算過程。
動態規劃法
動態規劃其實也是一種空間換取時間的演算法,通過快取計算的中間值,從而減少重複計算的次數。動態規劃採用正向求解,以便利用前面計算的結果。f(i,j)=min+arr[i][j]
,從i=1,j=1開始遍歷二維陣列,可以在遍歷的過程中求出所有的f(i,j)
的值。同時,把求出的值儲存到另外乙個二維陣列cache[i][j]
中以供後續使用。
public class helloworld
public static
intgetminpath
(int
arr)
public static
void
main
(string[
] args),,
};system.out.
println
(getminpath
(arr));
//結果為17
}}
輸出結果為:
17
public class helloworld
for(
int j=
1;j)//遍歷二維陣列,取最小的路徑存入剩餘的cache中
for(
int i=
1;i)else}}
system.out.
println
("["
+(row-1)
+","
+(col-1)
+"]");
return cache[row-1]
[col-1]
;}public static
void
main
(string[
] args),,
};system.out.
println
("路徑為:");
system.out.
println
("最小值為:"
+getminpath
(arr));
}}
執行結果為:
路徑為:
[0,1]
[0,2]
[2,1]
[2,2]
[2,2]
最小值為:17
動態規劃最短路徑問題
最短路徑問題 下圖給出了一張地圖,地圖中每個頂點代表乙個城市,兩個城市間的連線代表道路,連線上的數值代表道路長度,求從a地到e地的最短路徑。分析 本題可以利用深度搜尋法求解,偽 如下 vars 未訪問的城市集合 dist i,j 儲存任意兩個城市間的距離陣列 function search city...
Codeup最短路徑 最短路徑
n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離。第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道路,接下來m行兩個整數,表示相連的兩個城市的編號。n 1行,表示0號城市到其他城市的最短路,如果無法到達,輸出...
Codeup最短路徑 最短路徑問題
給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t 起點s,...