青少年编程知识记录 codecoming

【题解】导弹拦截

【题目描述】

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

输入导弹的枚数和导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数,每个数据之间至少有一个空格),计算这套系统最多能拦截多少导弹。

【输入描述】

第1行有1个整数n,代表导弹的数量。(n<=1000)

第2行有n个整数,代表导弹的高度。(雷达给出的高度数据是不大于30000的正整数)

【输出描述】

第一行:最多能拦截的导弹数;

第二行:要拦截所有导弹最少要配备的系统数。

【样例输入】

8  389  207  155  300  299  170  158  65

【样例输出】

6



【参考答案一】:只有第一个问题的解

#include<bits/stdc++.h>  using namespace std;  int a[30001],n,c;     //拦截的当前导弹的编号,拦截的数量,当前的高度   void dp(int i,int num,int h){  	if(i>n) return;  	//比较出最大值   	c = max(c,num);  	//向后递归   	for(int k=i+1;k<=n;k++){  		//如果高度 >= 当前导弹高度,则递归   		if( h >= a[k]){  			dp(k,num+1,a[k]);  		}else{  			dp(k,num,h);  		}  	}  }    int main(){     int i;     cin>>n;     for(i=1;i<=n;i++){     		cin>>a[i];     }     //每个导弹都可能成为第一枚       for(i=1;i<=n;i++){      	dp(i,1,a[i]);  	}     cout<<c;      return 0;  }



【参考答案二】:两个问题的解都有

#include<bits/stdc++.h>  using namespace std;  int a[1001],b[1001],c[1001];   int main()  {      int n=0,maxx=1;            while(scanf("%d",&a[n++])!=EOF)                for(int i=0;i<n;i++)      {          b[i]=1;          for(int j=0;j<i;j++)              if(a[j]>=a[i]&&b[j]+1>b[i])                  b[i]=b[j]+1;          maxx=max(maxx,b[i]);      }      printf("%d\n",maxx);            maxx=1;      for(int i=0;i<n;i++)      {          c[i]=1;          for(int j=0;j<i;j++)              if(a[j]<a[i]&&c[j]+1>c[i])                  c[i]=c[j]+1;          maxx=max(maxx,c[i]);      }      printf("%d\n",maxx);      return 0;  }





(adsbygoogle = window.adsbygoogle || []).push({});

标签: 动态规划

作者:亿万年的星光 分类:题解目录 浏览: