(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)测试结果也是显而易见的: