动态规划----数塔问题
2018-03-22 16:38
127 查看
package com.xjj.algorithm; import java.util.Scanner; /*-----动态规划----数塔问题------ * 1.n层有n个数 :求第一层到n层每次一个数最大和为多少? * * 2.除第一个数每个数都有选与不选两种决策,即每个数都有两个分支: * 则如果用枚举为 O(2^n) 很大; * * 3.令dp[i][j]为第 i 行第 j 个元素到底层的最大和,其值只与 i+1 行 第max(j,j+1)元素有关 * 故状态转移方程为 dp[i][j] = max(dp[i+1][j],dp[i+1][j+1]) + a[i][j]; * 边界 : dp [j] = a [j] 最后一行为元素本身 * * * */ public class Dp_num_towper { public static int n; public int dp_num(int[][] a){ //保存到底路径最大和值 int[][] dp = new int[n+1][n+1]; //初始化,设置边界 for(int i = 1; i <= n; i++) dp [i] = a [i]; //动态转移方程 for(int i = n-1; i >= 1; i--) for(int j = 1; j <= i; j++){ dp[i][j] = Math.max(dp[i+1][j], dp[i+1][j+1]) + a[i][j]; } //待求目标值 return dp[1][1]; } public static void main(String[] args) { System.out.println("输入数塔共几层:"); Scanner scanner = new Scanner(System.in); n = scanner.nextInt(); int[][] a = new int[n+1][n+1]; for(int i = 1; i <= n; i++) for(int j = 1; j <= i; j++){ a[i][j] = scanner.nextInt(); } Dp_num_towper dp = new Dp_num_towper(); System.out.println(dp.dp_num(a)); } }
动态规划:
1. 递归:自顶向下--从目标问题开始分解解决,直到到达边界返回为止;
递推:自底向上--从边界开始解决,直到解决目标问题;(将边界看作底,本题用递推)
2.最优子结构:如果一个问题的最优解可有其子问题的最优解有效地构造出来;
3.一个问题必须是拥有重叠子问题和最优子结构才能用动态规划解决;
4.分治法与动态规划:都是由子问题的解得出原问题的解,但分治法不存在重叠问题;如归并排序及快速排序均由左右序列问题治之,但不重叠,因而是分治法;
5.贪心与动态规划: 贪心是直接通过某一种策略,以单链的流水方式得到所谓“最优”选择,但结果不一定正确(如本题采取每次都取左右两元素中的最大值)--局部最优;但动态规划每次会考虑所有子问题,以得出全局最优。
相关文章推荐
- 动态规划问题
- 动态规划问题系列---Disk Schedule
- 动态规划--凑硬币问题
- 算法进阶之动态规划-01背包问题
- ACM;邮局问题;动态规划;O(n3); 四边形法则可以优化,暂时没研究,等待添加;
- 算法基础之python实现动态规划中数字三角形和最长上升子序列问题
- 动态规划之0-1背包问题
- 动态规划之背包问题(一)
- 动态规划之0-1背包问题
- 矩阵对角之间的走法常见问题之动态规划
- 动态规划入门问题
- 动态规划和背包dp问题
- 动态规划-矩阵连乘问题
- 动态规划初步-数塔问题
- 动态规划之01背包问题
- 动态规划-----背包问题-----01背包,完全背包,多重背包
- 动态规划两题(矩形嵌套+硬币问题)P161-162
- 动态规划_矩阵连乘问题
- 01背包问题 -- 经典动态规划题
- 动态规划:机器人走n米有多少种走法问题