动态规划
一、动态规划五部曲
1.确定dp(dp table)数组的含义
2.确定d[i]数组初始化值
3.确定递推公式
求max、求min、求和【装满背包有多少中方法】
4.确定遍历顺序
背包问题:
(1)考虑先循环物品还是先循环背包。
组合问题是先循环物品,排列问题是先循环背包[背包容量的每一个值,都是经过 1 和 5 的计算,包含了{1, 5} 和 {5, 1}两种情况]
(2)考虑dp数组是从前向后遍历,还是从后向前遍历
如果元素可以用无穷次的话就是前向后遍历【完全背包问题】,如果只能用一次的话就是从后向前【01背包问题】
5.举例推导dp数组
二、动态规划debug
推导dp数组
三、刷题
1.最长公共重复数组【要求连续的】与最长公共子序列【不要求连续】
递推表达式不太明白d[i][j]只考虑nums1[i-1]和nums2[j-1]相同不 相同,不考虑nums1[i-2]与nums2[j-1]
2.最长递增子序列【不要求连续】与最长连续递增子序列【要求连续】
结果是对dp状态求最大
3.【leetcode115】不同子序列
给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。
dp数组含义不懂、递推表达式不懂、初始化值不懂
(1)dp[i][j]表示以i-1结尾的字符串s出现以j-1结尾的字符串t的个数
(2)d[0][0]=1:空字符出现空字符串的个数
i=0,d[0][j]=0
d[i][0]=1
(3)一般考虑s[i-1]与t[j-1]相等不相等
如果相等 d[i][j]=d[i-1][j-1]+d[i-1][j](用s[i-1]与不用s[i-1]如bagg与bag)
如果不等d[i][j]=d[i-1][j]
4.【leetcode】两个字符串的删除
5.【leetcode139】单词拆分
同dp数组含义不清楚
6.【leetcode121】买卖股票
买卖一次、买卖多次、买卖两次、买卖k次、多次买卖有冷冻期、买卖有手续费
dp数组的定义很巧。最开始手上现金为0,dp[i][0]表示第i天持有股票的最多现金,dp[i][1]表示第i天不持有股票手上的现金
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步