DP一周做题报告1

好久没有更新博客啦,今天终于有时间来机房**啦!
上周我刷了不少DP题目,深有感触,所以今天特地来写一些总结。
直接题目!
例题一——导弹拦截
这里写图片描述

这道题目很经典,题目有两个问题,第二问是贪心问题,所以我们在这里只讨论第一问。
因为后面的导弹的高度一定小于等于前面的导弹的高度,所以最终拦截的导弹的高度是构成了一个不下上升序列,因为长度要最长,所以求的是一个最长不上升子序列。
我们可以设一个一维的dp数组,dp[i]表示前i个个导弹构成的最长不下降子序列。
对于第i个导弹(我们假设他一定被拦截),我们枚举第i个前面的导弹j(j小于i)
如果f[j]大于0,说明在前j个数里面存在最长不上升子序列,(注意跟前面一样,这里也是假设第j个在最长不上升子序列里面的),那么f[j]肯定是这条最长不上升子序列最小的数吧。假如第i个数的要小于第j个数,那我们可以将第i个数加在前j个数组成的最长不上升子序列的末尾,那么这条子序列是不是长度就加一了呢(这种情况叫做继承最优值)。
DP方程:
这里写图片描述
外层循环枚举第i个导弹,内层循环枚举1到i-1个导弹。
大家应该改能理解(这道题还是比较水的,我居然扯淡扯了怎么多。。。。)
与这道题目相类似的题目还有合唱队型,只不过那道题要做两次最长不下降子序列。
来一道差不多稍微进化点的题目!
例题二——轮船问题:
这里写图片描述
上一道题目是不能排序的,因为导弹的顺序无法更改。
但是这道目是可以排序的,因为他没有先后顺序的约束,只是让你求出最优方案的值。
排好序之后从左往右依次是一些线段,我们可以把一条线段想象成一个点,这些线段就是一条序列。和上一道题目一样,用f[i]表示前i条航线构成的最优值。对于第i条航线来说,我们找到所有在他前面的航线j,如果航线j和航线i不交叉,那么f[i]就可以继承f[j]的最优值了。因为我们假设的是第j条航线一定是f[j]中包含的一条航线并且是最后面的一条。
如果你明白了上面了那题,那这题肯定也能理解。dp方程不给了(其实就上改了一下上面那个的判断条件)
OJBK

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值