P1020 [NOIP1999 普及组] 导弹拦截 题解

本文探讨了利用序列动态规划(DP)解决最长不上升序列问题,并通过线段树优化时间复杂度至O(nlogn)。同时,介绍了如何应用类似方法处理最长上升子序列问题。关键步骤包括设计dp数组,更新策略以及线段树的使用。
思路 : 序列 DP + 线段树优化 DP

首先第一个问题,其实就是求最长不上升序列

我们设计 dpi{dp}_{i}dpi 为从 1 到 iii 且其最长不上升序列以 iii 为结尾的序列长度。那么我们可以从比当颗导弹高或相等的导弹中更新答案。即为:

dp[i] = max{
   
   dp[v]} + 1 (a[v] >= a[i] && v <= i)
这里时间复杂度为 O(n2)O(n^2)O(n2)

对于第二个问题,我们可以想到,假如我们先用一个拦截设施把所有能打下来的导弹都打下来,剩下的拦截设施重复这个动作,一直到所有导弹被拦截。假设我们得到的是最小划分(题目要求)的 kkk 组导弹。那么对于第 iii 组导弹中任取,在第 i+1i+1i+1 必定有一个导弹要比这颗导弹高,如果没有,那么我们完全可以把 i+1i+1i+1 组合并到第 iii 组。

所以我们找到一个最长的一个上升子序列,肯定序列中的每个导弹对应组导弹,如果多出的话肯定是多余的,如果少的话,不符合上述的分组。所以我们在找最小划分时,只需要找到一个最长上升子序列长度即可。

我们重新设计 dpi{dp}_{i}dpi 为从 1 到 iii 且其最长上升子序列以 iii 为结尾的序列长度。同上,我们可以得到:

dp[i] = max{
   
   dp[v]} + 1 (a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值