搜索
热搜: NOIP OIer 神牛
查看: 324|回复: 0

1827

[复制链接]

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2021-5-18 21:09:05 | 显示全部楼层 |阅读模式
#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个输出也就是所有数据能形成的最长上升序列
因为每次能拦截的都比前一个低,最多能拦截的导弹长度就是求最长下降序列,所以第二个输出也就是所有数据能形成的最长下降序列

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

津ICP备19006949号-1 | 津公网安备12010102000465号

快速回复 返回顶部 返回列表