线性dp
拦截导弹(acwing.1010) 【题意】:某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数,导弹数不超过1000),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。 【分析】:第一个输出直接LIS就行,对于第二个问要考虑贪心思想,考虑一个拦截系统,起最后一个的高度肯定越大越有利于后面的元素增加进来,所需要的系统肯定就越少。所以用一个g数组来维护其最小元素的最大值,元素的个数就是最终所需的最少的拦截系统的个数。 #include <cstdio> #include <algorithm> #include <cstdlib> using namespace std; const int maxn=1e3+10; int arr[maxn],t,dp[maxn]; int g[maxn]; int main() { int tot=0; while (~scanf("%d",&t)){ arr[++tot]=t; } int ans=0; for(int i=1