|
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
int v[10001],f[10001],g[10001];
int a=0;
int b=0;
int main(){
for(int i=1;i<=6;i++)
{
cin>>v[i];
f[i]=g[i]=1;(序列长度至少是1)
for(int j=1;j<i;j++)
{
if(v[i]<=v[j])
{
f[i]=max(f[i],f[j]+1);(在1-i-1这个区间里,如果v[i]<v[j]就说明可以形成一个下降的序列,所以长度加一,每次求取或者不取的最大值)
}
if(v[i]>v[j])
{
g[i]=max(g[i],g[j]+1);(在1-i-1这个区间里,如果v[i]>v[j]就说明可以形成一个上升的序列,所以长度加一,每次求取或者不取的最大值)
}
}
if(f[i]>a)
{
a=f[i];(a初始是0,所以第一次判断一定会等于f[i]这个长度,之后每次如果更新了f[i]的长度,且比上一个f[i]长度大,那就更新这个f[i]长度)
}
if(g[i]>b)
{
b=g[i];(a初始是0,所以第一次判断一定会等于f[i]这个长度,之后每次如果更新了f[i]的长度,且比上一个f[i]长度大,那就更新这个f[i]长度)
}
}
cout<<a<<b;(输出这两个最终的长度)
return 0;
}
因为每次能拦截的都比前一个低,所以只要出现有一个比之前所有数都高的高度,那这一套设备就拦截不了,需要第二台,所以只要后面的数据没有比之前的大,那就不需要新设备,求最少的设备数就是求最长上升序列,所以第1个输出也就是所有数据能形成的最长上升序列
因为每次能拦截的都比前一个低,最多能拦截的导弹长度就是求最长下降序列,所以第二个输出也就是所有数据能形成的最长下降序列
|
|