整理一下刷题过程中的一些想法,方便以后高效复习,动态规划部分整理如下:

主要的思路有如下几种:

基础类型

  • 只需要写出i和i-1之间的状态转移方程即可,没有任何额外操作的行为,比如:

    • 一维度:

      • 53. 最大子序和,状态方程是:dp[i] = max(dp[i-1]+nums[i],nums[i])
      • 70. 爬楼梯,状态方程是:result[i]=result[i-1]+result[i-2]
      • 198. 打家劫舍,状态方程是:dp[i] = max(dp[i-3],dp[i-2])+nums[i]
    • 高维度:
      • 120. 三角形最小路径和,状态方程是:dp[k][z] = min((dp[k-1][z]+triangle[k][z]),(dp[k-1][z-1]+triangle[k][z]))

      • 63. 不同路径 II,状态方程是:obstacleGrid[i][j] = obstacleGrid[i][j - 1] + obstacleGrid[i - 1][j]

      • 64. 最小路径和,状态方程是:mat[i][j] = min(mat[i - 1][j], mat[i][j - 1]) + grid[i][j]

      • 221. 最大正方形,状态方程是:dp[i][j] = min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1

中间变量类型

  • 需要额外借助第三方变量进行中间值判断的:

    • 121. 买卖股票的最佳时机,状态方程是:Math.max(profit, prices[i] - Math.min(minprofit, prices[i]));
    • 139. 单词拆分,状态方程是:dp[j] = True if dp[i] and s[i:j] in wordDict
    • 264. 丑数 II,状态方程是:int minval = Math.min(last_2,Math.min(last_3,last_5));

定制判断类型

  • 带有定制化的判断条件的:

    • 72. 编辑距离,状态方程条件是:word1[j-1]==word2[i-1]
    • 85. 最大矩形,状态方程条件是:matrix[i][j] != '0'
    • 91. 解码方法,状态方程条件是:s[i] != "0"和s[i - 1] != "0" and int(s[i - 1:i + 1]) <= 26
    • 152. 乘积最大子序列,状态方程条件是:MAX, MIN = MIN, MAX if nums[i] < 0
    • 300. 最长上升子序列,状态方程条件是:if (nums[i] > nums[j]) {dp[i] = Math.max(dp[i], dp[j] + 1);}
    • 338. 比特位计数,状态方程条件是:if (i%2==1){ans[i] = ans[i-1]+1;} else {ans[i] = ans[i/2];}

倒叙逆向类型

  • 174. 地下城游戏,状态转移方程是:dp[i][j] = max(1, min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j])
    反方向的的递归,比较打破常规思维

循环判断类型

  • 在dp的基础上需要再遍历已经扫过的数组。此类方法的复杂度一般较高:

    • 279. 完全平方数,状态转移方程是:
while i - j ** 2 >= 0:dp[i] = min(dp[i], dp[i - j ** 2] + 1)j += 1

预处理类型

  • 740. 删除与获得点数
    这题麻烦在预处理每一个值,因为值有可能重复:
target = [0] * (max(nums) + 1)
for num in nums:target[num] += num

之后的转移方程反而非常简单:d[i] = max(d[i - 1], d[i - 2] + target[i])

技巧类型

  • 940. 不同的子序列 II

这题在于要想到把字符转化对应的ASCII码,转移方程:array[ord(c)-ord("a")]=sum(array)+1,除此之外还需要想到新增一个字母等于当前所有字母后面可加+单独自身,这个方程确实非常非常有技巧


以上为LeetCode中比较有代表性的一些题目,把这些搞懂之后可以解决绝大多数dp的类似题型,以2020校招为例:

携程 - Deep learning Engineer

给定一个时刻表,根据目的地进行分组,同一个目的地必须尽可能的多分,不能打乱顺序,比如aabbcddc,需要分成aa|bb|cddc,而不能分成aabb|cddc,因为这种情况下不是最多,也不能分成aa|bb|c|dd|c,因为相同的c没有被分在一起;求分组个数;

这题就是典型的循环判断类型+中间变量类型,需要储存历史遍历结果并多次查询,代码解答

Tencent - Deep learning Engineer
花匠摆花问题,两个坑:
1.用traceback的就直接gg,比如我
2.dp[i]为当前的长度为i的可摆放个数,dp[i] = dp[i-1]+dp[i-k]为状态转移矩阵,更多解释看代码注释

这题就是简单的基础类型,唯一难的地方是要想到i-k这个dp结果

Dynamic Programming 动态规划就给大家整理到这,如果大家想看更多的数据结构问题,可以关注一下我的Github,希望有所帮助。

欢迎大家关注我的个人bolg,知乎,更多代码内容欢迎follow我的个人Github,如果有任何算法、代码、转行疑问都欢迎通过邮箱发消息给我。

DynamicProgramming动态规划整理相关推荐

  1. 背包问题动态规划matlab,01背包问题动态规划详解

    计算机算法分析考试:动态规划0-1背包问题,怎么算她说她没醉,却一直摇摇晃晃掉眼泪:你说你爱她,却从未想过给她一个家. 要考试了,老师给划重点有一题:动态规划0-1背包问题,怎么算. 怎么理问题描述: ...

  2. 计算机编程英语怎么写,计算机编程英语词汇大全.pdf

    计算机编程英语词汇大全 计算机编程英语词汇大全 算法常用术语中英对照 DataStructures基本数据结构 Dictionaries字典 PriorityQueues堆 GraphDataStru ...

  3. python相似性检测的安装包

    安装python-Levenshtein模块 pip install python-Levenshtein 使用python-Levenshtein模块 import Levenshtein 算法说明 ...

  4. python动态规划详解_经典动态规划例题整理(Python版)

    由于本人的算法基础较为薄弱,所以在这里整理一下自己的做过的题,使自己能够随时随地回顾温习. 然后,本篇文章将会持续更新自己遇到的一些比较经典动态规划的题目,大家如果对代码有任何问题,直接在文章下面评论 ...

  5. python典型例题_经典动态规划例题整理(Python版)

    由于本人的算法基础较为薄弱,所以在这里整理一下自己的做过的题,使自己能够随时随地回顾温习. 然后,本篇文章将会持续更新自己遇到的一些比较经典动态规划的题目,大家如果对代码有任何问题,直接在文章下面评论 ...

  6. dpresult在python中什么意思_动态规划(DP)的整理-Python描述

    今天整理了一下关于动态规划的内容,道理都知道,但是python来描述的方面参考较少,整理如下,希望对你有所帮助,实验代码均经过测试. 请先好好阅读如下内容--什么是动态规划? 摘录于<算法图解& ...

  7. LeetCode动态规划股票系列整理

    写在前面 股票感觉是LeetCode动态规划中系列最多的一类,交易次数不同,有冷冻期,含手续费,让买卖的最佳时机千奇百怪,但是只要掌握dp的方法,解决起来还是有套路可循的.依据dp的常规思想,股票问题 ...

  8. 动态规划(DP)的整理-Python描述

    今天整理了一下关于动态规划的内容,道理都知道,但是python来描述的方面参考较少,整理如下,希望对你有所帮助,实验代码均经过测试. 请先好好阅读如下内容–什么是动态规划? 摘录于<算法图解&g ...

  9. Python 动态规划(DynamicProgramming)-硬币找零

    动态规划(DynamicProgramming)-硬币找零 文章目录 动态规划(DynamicProgramming)-硬币找零 1.动态规划 a.什么是动态规划 b.适用对象 2.硬币找零-Codi ...

最新文章

  1. Alpha版本项目展示
  2. SpringBoot源码分析之@Scheduled
  3. ORA-00845 : MEMORY_TARGET not supported on this system(调大数据库内存无法启动)
  4. 5、找出100到1000内的不含9的素数,存到result.txt文件中
  5. 一文看懂Java微服务架构,WEB2.0,垂直架构,分布式架构,微服务架构
  6. sjms-2 创建型模式
  7. easypoi导入合并单元格_1分钟不到就能合并100个Excel工作表,这功能太强大了!...
  8. Kernel Method核方法—基本概念
  9. Free Ebook #1
  10. 按比例缩小图片的CSS代码
  11. 信息处理技术员下午考试试题分析
  12. 计算机专业Java毕业设计思路分享(项目+设计+源码)
  13. 桌面计算机休眠快捷键,Win7怎么在桌面创建休眠快捷方式|win7休眠快捷键
  14. 飞秋在使用高分辨率的显示器时字体太小,应该这样设置就和以前一样
  15. 内部显示不支持自定义分辨率
  16. 中国数字经济投资态势分析及发展前景深度评估报告2022-2028年版
  17. dolphinschedule2.0.5升级dolphinschedule3.1.1
  18. 凸优化(convex optimization)第二讲:convex set
  19. django - form
  20. 华为光功率模块监控SNMP OID

热门文章

  1. 互联网协议系统介绍(转载)
  2. 最新开源Faster-LIO:快速激光IMU里程计
  3. 7 Papers Radios | 机器人「造孩子」;谷歌裸眼3D全息视频聊天技术公开
  4. 从零搭建一套结构光3D重建系统[理论+源码+实践]
  5. PoseFormer:首个纯基于Transformer的 3D 人体姿态估计网络,性能达到 SOTA
  6. 3D点云two-stage目标检测方法优化综述
  7. php symfony框架,PHP-Symfony2全栈框架的停用组件
  8. tomcat8 热部署
  9. mysql 配置文件绑定ip_(三)设置mysql允许外部IP连接的解决方法及遇到的坑说明...
  10. map集合遍历_集合框架的部分内容