3.1概述

  1. 核心思想:
  2. 动态规划是计算机中解决最优化问题的一种方法
  3. 通过避免重复节点的计算来提高计算速度
  4. 使用字典或者哈希表保存计算中间结果,因此也称之为【记忆化搜索】
  5. 这也是动态算法是一种用空间换时间的策略
  6. 经典案例:
  7. 给定一个无序数组,找出其中最长的、递增的子序列的长度
  8. 思路:
  9. 暴力搜索:
  10. 定义一个函数 L(arrs,i), 返回从数组第i个长度开始的最长序列的长度
  11. 具体如下:
  12. public int L(int[] arrs, int i) {
  13. for(int j=i+1;j<arrs.length;j++) {
  14. if(arrs[j]>arrs[i]) {
  15. return L(j) + 1;
  16. }
  17. }
  18. }
  19. 遍历数组,找最长的递增子序列长度
  20. public int R(int[] arrs) {
  21. int max_length = 1;
  22. for(int i = 0; i<arr.length; i++) {
  23. max_length = max(max_length, L(arrs, i))
  24. }
  25. return
  26. }
  27. 给定一个无序数组,找出其中连续子序列的最大和
  28. 动态规划算法的一般思路:
  29. 穷举法/暴力搜索
  30. 如果发现大量重复计算
  31. 就用哈希表将中间计算结果保存下来
  32. 之后遍历到相同节点,直接从哈希表取值