【较难,技巧题】动态规划 [NOIP1999]拦截导弹 ——求最大下降子序列长和最小覆盖全部数据的序列数

博客介绍了如何运用动态规划解决NOIP1999年竞赛中的拦截导弹问题。主要内容包括:(1)如何找到最大非上升子序列的长度,避免使用O(nlogn)的方法;(2)计算拦截所有导弹所需的最少导弹拦截系统套数,涉及最大上升子序列的定理应用。文中提供了思路1的详细解题过程和关键注意事项,如lower_bound函数的使用、数组状态的更新等。
摘要由CSDN通过智能技术生成

点击打开链接(新发现的一个oj,样式很小清新呀)

题目大意:n个导弹,(1)求最大非上升子序列长度(2)要拦截所有导弹最少要配备这种导弹拦截系统的套数

思路1:每一次求最大非上升子序列,求一次删一次。直到数组全0。有点害怕超时,然而没有hhh

注意:

1、需要记录序列不能用O(nlogn)的方法
2、lower_bound()函数的要求是查找数组是非递减的,找第一个>=x的位置;upper_bound(a.begin(),a.end(),x)求求非递减数组中第一个>x的位置
3、剔除元素后,内外循环都要判断a[i]==0
4、使用memset要加头文件<string.h>(vs中不会出错,但是oj会bug)

5、剔除元素判断必须用dp[j],用pre[j]最后一个元素剔除不了

思路2:(2)是求最大上升子序列(参考,虽然没很懂,但是记住这个定理吧,可以套模板)

两个定理:定理1 令(X,≤)是一个有限偏序集,并令r是其最大链的大小。则r为X的最大反链数。
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值