动态规划

一、动态规划五部曲

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天不持有股票手上的现金

posted @   HappierJoanne  阅读(53)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示