当前位置:   article > 正文

动态规划----数塔问题_头歌本关任务:编写用动态规划解决数塔问题。

头歌本关任务:编写用动态规划解决数塔问题。
  1. package com.xjj.algorithm;
  2. import java.util.Scanner;
  3. /*-----动态规划----数塔问题------
  4. * 1.n层有n个数 :求第一层到n层每次一个数最大和为多少?
  5. *
  6. * 2.除第一个数每个数都有选与不选两种决策,即每个数都有两个分支:
  7. * 则如果用枚举为 O(2^n) 很大;
  8. *
  9. * 3.令dp[i][j]为第 i 行第 j 个元素到底层的最大和,其值只与 i+1 行 第max(j,j+1)元素有关
  10. * 故状态转移方程为 dp[i][j] = max(dp[i+1][j],dp[i+1][j+1]) + a[i][j];
  11. * 边界 : dp[n][j] = a[n][j] 最后一行为元素本身
  12. *
  13. *
  14. * */
  15. public class Dp_num_towper {
  16. public static int n;
  17. public int dp_num(int[][] a){
  18. //保存到底路径最大和值
  19. int[][] dp = new int[n+1][n+1];
  20. //初始化,设置边界
  21. for(int i = 1; i <= n; i++)
  22. dp[n][i] = a[n][i];
  23. //动态转移方程
  24. for(int i = n-1; i >= 1; i--)
  25. for(int j = 1; j <= i; j++){
  26. dp[i][j] = Math.max(dp[i+1][j], dp[i+1][j+1]) + a[i][j];
  27. }
  28. //待求目标值
  29. return dp[1][1];
  30. }
  31. public static void main(String[] args) {
  32. System.out.println("输入数塔共几层:");
  33. Scanner scanner = new Scanner(System.in);
  34. n = scanner.nextInt();
  35. int[][] a = new int[n+1][n+1];
  36. for(int i = 1; i <= n; i++)
  37. for(int j = 1; j <= i; j++){
  38. a[i][j] = scanner.nextInt();
  39. }
  40. Dp_num_towper dp = new Dp_num_towper();
  41. System.out.println(dp.dp_num(a));
  42. }
  43. }




动态规划

1. 递归:自顶向下--从目标问题开始分解解决,直到到达边界返回为止;

    递推:自底向上--从边界开始解决,直到解决目标问题;(将边界看作底,本题用递推)


2.最优子结构:如果一个问题的最优解可有其子问题的最优解有效地构造出来;

3.一个问题必须是拥有重叠子问题和最优子结构才能用动态规划解决;


4.分治法与动态规划:都是由子问题的解得出原问题的解,但分治法不存在重叠问题;如归并排序及快速排序均由左右序列问题治之,但不重叠,因而是分治法;


5.贪心与动态规划: 贪心是直接通过某一种策略,以单链的流水方式得到所谓“最优”选择,但结果不一定正确(如本题采取每次都取左右两元素中的最大值)--局部最优;但动态规划每次会考虑所有子问题,以得出全局最优。



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/538244
推荐阅读
相关标签
  

闽ICP备14008679号