题目链接
题目思路
本题的问题是一套系统最多拦截的导弹数量以及拦截所有导弹需要的系统套数。其实就是求最大上升子序列与最大下降子序列。
首先看第一个问题,一套系统最多拦截的导弹数量,题目要求一套系统拦截的导弹第一颗可以任意高度,但是之后所拦截的导弹高度不得高于之前拦截的那颗导弹。也就是比如说第一颗拦截的高度为100,之后拦截的导弹高度就不能超过100,可以为100,可以为99,但是不能101。因此这道题就是找到最大下降子序列。
然后看第二个问题,拦截所有导弹需要的系统套数,那也就是求总共有多少个下降子序列,几个下降子序列就是几套。然后,通过狄尔沃斯定理(dilworth)可以知道,要求下降子序列的数量,也就是求最大上升子序列长度。
要求最大上升子序列,我们常规想到的就是用dp[i]=max(dp[i],dp[j]+1),然后套一个双重循环,这样的解原本数据规模为2000的没什么问题,但是这道题将数据规模扩大到了1e5,显而易见,要是使用双重循环会超时,所以我们要优化程序。这时,我们就可以考虑使用二分查找来解决这个问题。
二分思路:
1)先将数组中的第1个元素存到一个新的数组
2)再将原数组剩下的元素与新数组最后一个元素进行比较