例如:
589,58,79,26,12
最长序列为:589,58,26,12或589,79,26,12 长度为4
楼主的问题其实就是
〖问题描述〗拦截敌国飞弹问题
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。
但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹
能够达到任意的高度,但是以后每一发炮弹都不能高于前
一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该
系统还在使用阶段,所以只有一套系统,因此有可能不能
拦截所有的导弹。输入导弹依次飞来的高度(雷达给出高
度数据是不大于30000的正整数) 计算这套系统最多能拦
截多少导弹?
输入 第一行 为导弹的个数
第二行 为使用逗号分隔的导弹依次飞来的高度
(雷达给出的高度数据是不大于30000 的正整数)
输出 这套系统最多能拦截多少导弹
测试输入
9 <回车>
190,207,155,300,299,170,800,158,650 <回车>
期待的输出 This machine can hold up 4 missles.
----------------------------------------------
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
main()
{
int func(int*,int,long);
int num,*high,h,i;
int hit=0;//统计击落的飞弹
int HIT=0;//记录最大击落量
long st1,st2,sta;//状态变量
long STA;//状态(最大击落时)
printf("飞弹总数=");
scanf("%d",&num);
high=(int*)malloc(num*sizeof(int));
for(i=0;i<num;i++){
printf("飞弹No.%d高度=",i+1);
scanf("%d",&high[i]);}
st1=0;//一个都不拦截
st2=(long)pow(2,num)-1;//(企图)个个拦截
for(sta=st1;sta<=st2;sta++)
{
hit=func(high,num,sta);
if(hit<=HIT)continue;
HIT = hit;//刷新记录
STA = sta;//保存状态
}
printf("\n事后诸葛亮式的最佳对策是\n");
for(hit=i=0;i<num;i++)
{ char
b=STA%2;STA/=2;
if(b)
{
printf("主动拦截No.%d飞弹,",i+1);
if(hit==0||high[i]<=h)
{
printf("将其击落\n");
h=high[i];hit++;
}
else
printf("未能击落\n");
}
else
printf("放弃拦截No.%d飞弹\n",i+1);
}
printf("据此方案,共击落敌国飞弹%d枚\n",hit);
//或printf("据此方案,共击落敌国飞弹%d枚\n",HIT);
free(high);
}
int func(int*a,int n,long sta)
{
int k,func=0;
long high=999999;
char b;
if(sta>0)
for(k=0;k<n;k++)
{ b=sta%2;sta/=2;
if(!b)continue;//主动放弃
if(a[k]>high)break;
func++;
high=a[k];
}
return func;
}