拦截导弹 && 又见拦截导弹 (单调递增子序列 与 单调递增子序列的个数)

来源:互联网 发布:惠州温泉知乎 编辑:程序博客网 时间:2024/06/05 08:42


拦截导弹

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述

某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于等于前一发的高度。某天,雷达捕捉到敌国导弹来袭。由于该系统还在试用阶段,所以只用一套系统,因此有可能不能拦截所有的导弹。

输入
第一行输入测试数据组数N(1<=N<=10)
接下来一行输入这组测试数据共有多少个导弹m(1<=m<=20)
接下来行输入导弹依次飞来的高度,所有高度值均是大于0的正整数。
输出
输出最多能拦截的导弹数目
样例输入
28389 207 155 300 299 170 158 65388 34 65
样例输出
62

code:
#include<iostream>#include<cstdio>#include<algorithm>#include<string>#include<string.h>using namespace std;int dp[31];int aa[31];int main(){    int n,i,j,t,ans;    cin>>t;    while(t--)    {        cin>>n;        for(i=0; i<n; i++)            scanf("%d",&aa[i]);        fill(dp,dp+n,1);        ans=1;        for(i=1; i<n; i++)            for(j=i-1; j>=0; j--)            {                if(aa[i]<aa[j])                {                    dp[i]=max(dp[i],dp[j]+1);                    if(ans<dp[i])                    ans=dp[i];                }            }        cout<<ans<<endl;    }    return 0;}



又见拦截导弹

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述

大家对拦截导弹那个题目应该比较熟悉了,我再叙述一下题意:某国为了防御敌国的导弹袭击,新研制出来一种导弹拦截系统但是这种导弹拦截系统有一个缺陷它的第一发炮弹能够到达任意的高度但是以后每一发炮弹都不能超过前一发的高度。突然有一雷达捕捉到敌国的导弹来袭。由于该系统存在缺陷,所以如果想把所有的导弹都拦截下来,就要多准备几套这样的导弹拦截系统。但是由于该系统成本太高,所以为了降低成本,请你计算一下最少需要多少套拦截系统。

输入
有多组测试数据。
每组数据先输入一个整数N(N≤3000),代表有N发导弹来袭。接下来有N个数,分别代表依次飞来的导弹的导弹的高度。当N=-1时表示输入结束。
输出
每组输出数据占一行,表示最少需要多少套拦截系统。
样例输入
8389 207 155 300 299 170 158 655265 156 123 76 26
样例输出
21
code:
#include<stdio.h>#include<iostream>#include<algorithm>using namespace std;int dp[3100];//表示不包含i导弹的单调序列的个数int main(){    int n,t,i,j,ans,a[3100];    while(scanf("%d",&n) && n!=-1)    {        ans=0;        fill(dp,dp+n,1);        for(i=0;i<n;i++)            scanf("%d",&a[i]);        for(i=1;i<n;i++)            for(j=i-1;j>=0;j--)            {                if(a[i]>a[j])//说明j与i不在同一个序列,就这一处不同            dp[i]=max(dp[i],dp[j]+1);            if(ans< dp[i])            ans=dp[i];            }        cout<<ans<<endl;    }    return 0;}


0 0
原创粉丝点击