思路 : 序列 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

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

被折叠的 条评论
为什么被折叠?



