DynamicProgramming动态规划整理
整理一下刷题过程中的一些想法,方便以后高效复习,动态规划部分整理如下:
主要的思路有如下几种:
基础类型
- 只需要写出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]
- 53. 最大子序和,状态方程是:
- 高维度:
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));
- 121. 买卖股票的最佳时机,状态方程是:
定制判断类型
- 带有定制化的判断条件的:
- 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];}
- 72. 编辑距离,状态方程条件是:
倒叙逆向类型
- 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动态规划整理相关推荐
- 背包问题动态规划matlab,01背包问题动态规划详解
计算机算法分析考试:动态规划0-1背包问题,怎么算她说她没醉,却一直摇摇晃晃掉眼泪:你说你爱她,却从未想过给她一个家. 要考试了,老师给划重点有一题:动态规划0-1背包问题,怎么算. 怎么理问题描述: ...
- 计算机编程英语怎么写,计算机编程英语词汇大全.pdf
计算机编程英语词汇大全 计算机编程英语词汇大全 算法常用术语中英对照 DataStructures基本数据结构 Dictionaries字典 PriorityQueues堆 GraphDataStru ...
- python相似性检测的安装包
安装python-Levenshtein模块 pip install python-Levenshtein 使用python-Levenshtein模块 import Levenshtein 算法说明 ...
- python动态规划详解_经典动态规划例题整理(Python版)
由于本人的算法基础较为薄弱,所以在这里整理一下自己的做过的题,使自己能够随时随地回顾温习. 然后,本篇文章将会持续更新自己遇到的一些比较经典动态规划的题目,大家如果对代码有任何问题,直接在文章下面评论 ...
- python典型例题_经典动态规划例题整理(Python版)
由于本人的算法基础较为薄弱,所以在这里整理一下自己的做过的题,使自己能够随时随地回顾温习. 然后,本篇文章将会持续更新自己遇到的一些比较经典动态规划的题目,大家如果对代码有任何问题,直接在文章下面评论 ...
- dpresult在python中什么意思_动态规划(DP)的整理-Python描述
今天整理了一下关于动态规划的内容,道理都知道,但是python来描述的方面参考较少,整理如下,希望对你有所帮助,实验代码均经过测试. 请先好好阅读如下内容--什么是动态规划? 摘录于<算法图解& ...
- LeetCode动态规划股票系列整理
写在前面 股票感觉是LeetCode动态规划中系列最多的一类,交易次数不同,有冷冻期,含手续费,让买卖的最佳时机千奇百怪,但是只要掌握dp的方法,解决起来还是有套路可循的.依据dp的常规思想,股票问题 ...
- 动态规划(DP)的整理-Python描述
今天整理了一下关于动态规划的内容,道理都知道,但是python来描述的方面参考较少,整理如下,希望对你有所帮助,实验代码均经过测试. 请先好好阅读如下内容–什么是动态规划? 摘录于<算法图解&g ...
- Python 动态规划(DynamicProgramming)-硬币找零
动态规划(DynamicProgramming)-硬币找零 文章目录 动态规划(DynamicProgramming)-硬币找零 1.动态规划 a.什么是动态规划 b.适用对象 2.硬币找零-Codi ...
最新文章
- Alpha版本项目展示
- SpringBoot源码分析之@Scheduled
- ORA-00845 : MEMORY_TARGET not supported on this system(调大数据库内存无法启动)
- 5、找出100到1000内的不含9的素数,存到result.txt文件中
- 一文看懂Java微服务架构,WEB2.0,垂直架构,分布式架构,微服务架构
- sjms-2 创建型模式
- easypoi导入合并单元格_1分钟不到就能合并100个Excel工作表,这功能太强大了!...
- Kernel Method核方法—基本概念
- Free Ebook #1
- 按比例缩小图片的CSS代码
- 信息处理技术员下午考试试题分析
- 计算机专业Java毕业设计思路分享(项目+设计+源码)
- 桌面计算机休眠快捷键,Win7怎么在桌面创建休眠快捷方式|win7休眠快捷键
- 飞秋在使用高分辨率的显示器时字体太小,应该这样设置就和以前一样
- 内部显示不支持自定义分辨率
- 中国数字经济投资态势分析及发展前景深度评估报告2022-2028年版
- dolphinschedule2.0.5升级dolphinschedule3.1.1
- 凸优化(convex optimization)第二讲:convex set
- django - form
- 华为光功率模块监控SNMP OID
热门文章
- 互联网协议系统介绍(转载)
- 最新开源Faster-LIO:快速激光IMU里程计
- 7 Papers Radios | 机器人「造孩子」;谷歌裸眼3D全息视频聊天技术公开
- 从零搭建一套结构光3D重建系统[理论+源码+实践]
- PoseFormer:首个纯基于Transformer的 3D 人体姿态估计网络,性能达到 SOTA
- 3D点云two-stage目标检测方法优化综述
- php symfony框架,PHP-Symfony2全栈框架的停用组件
- tomcat8 热部署
- mysql 配置文件绑定ip_(三)设置mysql允许外部IP连接的解决方法及遇到的坑说明...
- map集合遍历_集合框架的部分内容