• 动态规划实现数字三角形问题


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

  • 相关阅读:
    ubuntu android jdk问题
    android adb ubuntu问题
    常用命令
    svn info
    TaskRecord分析
    moveTasktoBack 把当前任务放入后台
    WatchDog机制
    双系统安装
    制作安装U盘
    android 小游戏 ---- 数独(二)
  • 原文地址:https://www.cnblogs.com/fsmly/p/10053749.html
Copyright © 2020-2023  润新知