动态规划的题型总结

很久之前做的笔记,笔记放不下了,先放在csdn吧,以后有空重新提高下质量…

一、递推求解

二、最大连续子序列和

  • 一维
  • 二维

三、最长递增子序列

问题描述:求给定序列的所有递增子序列中最长的那个子序列长度
令dp[i]表示以A[i]作为末尾的最长递增子序列的长度;

  • 情形一:A[i]之前的元素都比A[i]大,即最长递增子序列只有A[i]本身,即dp[i]=1;
  • 情形二:A[i]之前存在比A[i]小的元素A[j],那么dp[i]=max(dp[j]+1|j<i&&A[j]<A[i]);
    • 此处注意,dp[i]并不一定等于最近的位置j(满足A[j]<A[i])的元素的dp值加1,而是等于前序所有满足A[j]<A[i]的具有最大的dp值的dp[j]+1。
    • 举例:1 2 4 7 8 3 9.对于dp[6]来说,离它最近满足条件A[5]=3,dp[5]=3,如果按最近的处理,那么dp[6]=4,序列为1 2 3 9,这显然是错误的。正确的dp[6]=dp[4]+1=6,序列为1 2 4 7 8 9;

如此得到状态转移方程:dp[i]=max{1,dp[j]+1||j<i&&A[j]<A[i]},时间复杂度为O(n^2)

四、最长公共子序列

五、背包问题

  1. 0-1背包:每种物品至多只能选择一件,在背包中该物品的数量只有0和1两种情况;
    • 内循环从大到小至j>=weight[i]
    • 为什么贪心策略不能解决0-1背包问题?贪婪准则:价值vi,质量wi,每一项计算ri=vi/wi,即价值和质量之比,再按比值的降序来排序,从第一项开始装背包,然后是第二项,依次类推,尽可能的多放,直到装满背包。这种策略并不能保证得到最优解。利用此策略试解n= 3 ,w=[40,35,35], v=[40,30,20], c=70 时的最优解。直觉上它可能是对的,得到的结果是选择w[0]=40,剩余30的空间容量不能装下其他物品,总价值量为40。很显然,这是错误的,真正可以获得的最大价值是30+20=50。事实上这一方法只是解决普通背包问题的最优解,因为按此方法在选择物品i装入背包时,我们是可以选择物品i的一部分的,不一定要全部装入背包。但是实际上0-1背包问题的特点就是每个个体是不可拆分的,那么此时再按贪心策略就不能证明结果是正确的,相反我们可以举出反例证明它是错误的。这两者的关系其实有点类似于概率论中古典概型和几何概型问题的区分。对于一个方法是否正确,有时我们虽然不能直接通过理论证明它是正确的或是不正确,但如果是错误的,一定可以通过反例证明。理论不能证明正确的方法一般就不要使用,因为有可能存在反例使它出现错误的结果。而对于动态规划的解法,它的本质是枚举,这个方法无疑是证明正确的。
  2. 0-1背包变体求最小值,初始值一般设为INF=INT_MAX/10;
  3. 完全背包,背包中每类物品数量无线,循环时从小到大开始,从j=weight[i]到m为止。
  4. 多重背包:即每种物品的数量既不是有限的,也不是只能取一次,而是有限个k次。
    • 解决办法:转化为0-1背包问题,每种物品均视为k种重量和价值都相同的不同物品,如此时间复杂度为O(m*∑24_(i=0)^nk_i ),但如此复杂度较高
    • 进一步优化,将一类物品拆分为若干组,将每组物品视为一件物品,价值和重量为该组所有物品的价值重量总和。每组物品包含的原物品的个数分别为20,21,……,2(c−1),k-2c+1,其中c是使得k-2c+1≥0的最大整数。这种类似于二进制的拆分,不仅将物品数量大大降低,同时通过由若干原物品得到新物品的不同组合,可以得到0到k之间的任意件物品的价值重量和,所以对所有这些新物品做0-1背包,即可得到多重背包的解。

六、其他问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Milk_exe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值