1. 程式人生 > >動態規劃實現數字三角形問題

動態規劃實現數字三角形問題

 (1)題目描述如圖所示

    

 

  (2)我們用上述矩陣分析:自頂向下分析入下圖二維矩陣所示

  (3)我們從arr[2][0]開始分析,arr[2][0]是計算當前位置按照題中要求(每一條路徑只能往下或者右下走),可以得到arr[3][0]>arr[3][1],所以arr[2][0]值更新為arr[3][0]+arr[2][0],類似的arr[2][1]的值更新為arr[3][1]和arr[3][2]中較大的值,即arr[2][1]+arr[3][2]......按照這樣的遞推方式,我們可以在arr[0][0]的時候得到最大值,這個最大值就是我們需要求出的最長路徑。

  (4)而由上述分析,我們也可以簡單的總結出這個題目的狀態公式:

 

  (5)這樣我們可以簡單的總結出程式碼

 1 /**
 2  * 三角形矩陣  求最小路徑
 3  *
 4  */
 5 public class Test5 {
 6     //給定一個二維陣列
 7     static int[][] arr = {
 8                             {2,0,0,0},
 9                             {3,4,0,0},
10                             {6,5,7,0},
11                             {4,1,8,3}};
12 static int[][] triangle = { 13 {7,0,0,0,0}, 14 {3,8,0,0,0}, 15 {8,1,0,0,0}, 16 {2,7,4,4,0}, 17 {4,5,2,6,5} 18 }; 19 /* 20 * 狀態方程 21 * f(i,j) = min{f(i,j+1),f(i+1,j+1)}+(i,j) 22 */ 23 public static void main(String[] args) {
24 25 int len = arr.length; 26 System.out.println("動態規劃:"); 27 System.out.println(maxTotal(arr)); 28 System.out.println(maxTotal(triangle)); 29 } 30 31 /** 32 * 動態規劃實現 33 * @param arr 34 * @return 35 */ 36 static int maxTotal(int[][] arr) { 37 for (int i = arr.length - 2; i >= 0; i--) { 38 for (int j = 0; j < i+1; j++) { 39 arr[i][j] += Math.max(arr[i+1][j], arr[i+1][j+1]); 40 } 41 } 42 return arr[0][0]; 43 } 44 }

  (6)測試結果也是顯而易見的: