動態規劃實現數字三角形問題
阿新 • • 發佈:2018-12-02
(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)測試結果也是顯而易見的: