p1254 导弹拦截

版权声明:https://blog.csdn.net/huashuimu2003 https://blog.csdn.net/huashuimu2003/article/details/84893644

题目

描述 Description
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
  输入导弹的枚数和导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数,每个数据之间有一个空格),计算这套系统最多能拦截多少导弹?如果要拦截所有导弹最少要配备多少套这种导弹拦截系统?
输入格式 Input Format
第一行数字n表示n个导弹(n<=200)
第二行n个数字,表示n个导弹的高度
输出格式 Output Format
一个整数,表示最多能拦截的导弹数
一个整数,表示要拦截所有导弹最少要配备的系统数
样例输入 Sample Input

8
389 207 155 300 299 170 158 65
样例输出 Sample Output

6
2
时间限制 Time Limitation
1s
来源 Source
noip原题

代码

#include<bits/stdc++.h>
using namespace std;
int v[10005],f[10005],g[10005]={0,1},maxn,minn; 
//maxn表示最长上升子序列长度,minn表示最长下降子序列的长度
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&v[i]); //输入每枚导弹的高度
        f[i]=g[i]=1; 
        for(int j=1;j<i;j++)
        {
            if(v[i]<=v[j]) //求最长上升子序列
            	f[i]=max(f[i],f[j]+1);
            if(v[i]>v[j]) //求最长下降子序列
        		g[i]=max(g[i],g[j]+1);
        }
        if(f[i]>maxn) //求出最长上升子序列的长度
        	maxn=f[i];       
        if(g[i]>minn) //求出最长下降子序列的长度
            minn=g[i];        
    }
    printf("%d\n%d\n",maxn,minn); 
    /*输出最长上升子序列长度与最长下降子序列的长度,也就是需要多少套拦截
    系统与一套系统最多拦截多少枚导弹*/
    return 0;
}
//本题将经典的动态规划的模板融入进题干里,关键是要把它挖掘出来,就成功了!

猜你喜欢

转载自blog.csdn.net/huashuimu2003/article/details/84893644