动规——总集


能帮到你的话,就给个赞吧 😘


文章目录

dp定义

无后效性——个人

f(x) = y
f(x): 状态 y:状态的值

f(n) = x.

f(n + 1) 为定值。
解释:
因为满足 f(n) = x 的情况可能有多种。而无后效性指的是
无论哪一种,f(n + 1)的值从 f(n) = x 那一刻起便是唯一,不会受到f(n) = x不同情况的影响。即

不能出现不同的 f(n) = x, 对应不同的 f(n + 1)。

dp无法定义区域最优,只能定义点最优——个人经验之谈

即dp无法定义区域到底的最优,只能定义点到底的最优

遍历:有没有遍历漏

动规框架

509. 斐波那契数

322. 零钱兑换

递归算法时间复杂度

= 节点数乘以每个节点所需的时间。
节点数 = 2^ (树高) --二叉树

状态转移

状态:
即f(n)。由于 f(n) 是不断变化的,所以把 f(n) 的每个值叫做状态。
转移:
即状态的转移。即 f(n) 间的转移。即 f(n) 间的关系。
在斐波那契数中
f(n) 由 f(n - 1) 和 f(n-1) 转移(相加) 而来。

压缩DP table

最优子结构

子问题间相互独立

如何列出状态转移方程

1.确定变量 即 f(n)

2.确定选择 即每一次操作有多少种选择

动划设计:最长递增子序列

300. 最长递增子序列

354. 俄罗斯套娃信封问题

1.明确 dp 数组的定义

这一步对于任何动态规划问题都很重要,如果不得当或者不够清晰,会阻碍之后的步骤。

2.根据 dp 数组的定义,运用数学归纳法的思想,假设 dp[0…i-1] 都已知,想办法求出 dp[i],一旦这一步完成,整个题目基本就解决了。

如果无法完成这一步,很可能就是 dp 数组的定义不够恰当,需要重新定义 dp 数组的含义;或者可能是 dp 数组存储的信息还不够,不足以推出下一步的答案,需要把 dp 数组扩大成二维数组甚至三维数组。

3.也就是对于 dp[i] 已知的有 dp[0…i-1] 和 nums[0…i]

base case 和备忘录的初始值

931. 下降路径最小和

动态规划穷举的两种视角

115. 不同的子序列

动态规划和回溯算法的转换

139. 单词拆分

140. 单词拆分 II

dp——子序列

经典动态规划:编辑距离*

72. 编辑距离

如何确定递归存在重复

int dp(i, j) {
    dp(i - 1, j - 1); // #1
    dp(i, j - 1);     // #2
    dp(i - 1, j);     // #3
}

对于子问题 dp(i-1, j-1)
原问题 dp(i, j) 可以通过#1 和 -> #2 -> #3达到。
即重复

利用指针实现插入,删除,替换

两种方向的区别

动态规划设计:最长递增子序列

300. 最长递增子序列

354. 俄罗斯套娃信封问题

动态规划设计:最大子数组

53. 最大子数组和

子串与子序列 dp设计的区别

经典动态规划:最长公共子序列

1143. 最长公共子序列*

583. 两个字符串的删除操作

712. 两个字符串的最小ASCII删除和

与编辑距离显示递归的两种方向

动态规划之子序列问题解题模板

516. 最长回文子序列*

dp的定义

还是要熟悉回文判断,否则不可能如此定义。

dp 两个底不可缺少
dp 不一样的遍历

1312. 让字符串成为回文串的最少插入次数

dp——背包

经典动态规划:子集背包问题

416. 分割等和子集*

经典动态规划:完全背包问题

518. 零钱兑换 II*

目标和:背包问题的变体

494. 目标和*

回溯和动规的区别

我觉得没什么区别

背包与子集

dp[i][j] = x 表示,若只在前 i 个物品中选择,若当前背包的容量为 j,则最多有 x 种方法可以恰好装满背包。
翻译成子集问题就是,若只在 nums 的前 i 个元素中选择,若目标和为 j,则最多有 x 种方法划分子集。

dp——现实问题

动态规划之最小路径和

64. 最小路径和*

底的取值
memo size设置

动态规划帮我通关了《魔塔》

174. 地下城游戏

动态规划帮我通关了《辐射4》

514. 自由之路*

没有理解题意
自身写的递归会无限重复*
min报错 参数不同

https://blog.csdn.net/Draonly/article/details/113308428

旅游省钱大法:加权最短路径

787. K 站中转内最便宜的航班*

底也是有先后顺序的
子解为-1要跳过

经典动态规划:正则表达式

10. 正则表达式匹配*

底*
通配符选择 以及 通配符选择后的情况*
代码编写技巧*

经典动态规划:高楼扔鸡蛋

887. 鸡蛋掉落*

最坏情况
选择 (n叉树)
选择后的结果 (dp的参数)
dp数组 为什么只初始化第一行不行

经典动态规划:戳气球

312. 戳气球*

关于底 不能使用i + 2 == j 为什么
dp不仅需要记住其定义,还需要记住其现实意义
dp定义的关键在于做完选择后,原dp = 新dp + 选择

经典动态规划:博弈问题

877. 石子游戏

486. 预测赢家*

dp涉及到对手的切换

LeetCode 打家劫舍问题

198. 打家劫舍

213. 打家劫舍 II*——环

围成一圈等于首尾相连,因此可以分成两种情况即不偷第一家和不偷最后一家。
改dp

337. 打家劫舍 III

一个方法团灭 LeetCode 股票*

121. 买卖股票的最佳时机

122. 买卖股票的最佳时机 II

309. 最佳买卖股票时机含冷冻期

714. 买卖股票的最佳时机含手续费

123. 买卖股票的最佳时机 III

188. 买卖股票的最佳时机 IV

dp

状态

什么是状态

红黄绿是红绿灯的三种状态

一次选择会改变所有参数的状态

leetcode题单

01 5. 最长回文子串*——子串

02 32. 最长有效括号*——子串

03 44. 通配符匹配*——同10. 正则表达式匹配

通配符的使用规则

04 45. 跳跃游戏 II

05 55. 跳跃游戏

06 62. 不同路径

回溯与动规(不带memo)并无区别
memo大小的设置

07 63. 不同路径 II

62 63严格来讲并不算动规。故省略。应用回溯做

08 70. 爬楼梯

同62 63

09 91. 解码方法

10 97. 交错字符串

11 115. 不同的子序列*——回溯&子序列

底的技巧

同打家劫舍3

12 118. 杨辉三角——非典型

13 119. 杨辉三角 II——非典型

14 120. 三角形最小路径和*——最小路径和

到底什么是选择?元素节点的选择

15 152. 乘积最大子数组*——子串

同 53. 最大子数组和

16 221. 最大正方形*——遍历 + dp

同 1277. 统计全为 1 的正方形子矩阵

17 241. 为运算表达式设计优先级*——回溯

关于运算符的都不太会啊

18 264. 丑数 II——非dp

19 279. 完全平方数——数学 + 最小距离

20 313. 超级丑数——非dp

21 343. 整数拆分*

22 368. 最大整除子集*——子集

子集 == 子序列

23 392. 判断子序列——回溯

24 410. 分割数组的最大值*——子串

25 435. 无重叠区间*——子序列 + 遍历&dp

26 542. 01 矩阵*——环

27 576. 出界的路径数*——回溯&环

28 638. 大礼包——待做

29 792. 匹配子序列的单词数*——回溯 (子集就是序列)

30 918. 环形子数组的最大和*——环+子数组

31 931. 下降路径最小和*——经典例题

区间最优该怎么做。

底的顺序

底的设置 不能设为100

memo的设置

边界问题

32 968. 监控二叉树

33 1024. 视频拼接*——子序列

34 1425. 带限制的子序列和——子序列, dp&遍历

35 1696. 跳跃游戏 VI

同34——区间还是点
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值