欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛 H-程序员的好印象【LIS】

程序员文章站 2022-06-08 12:09:15
...

题目描述 

2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛 H-程序员的好印象【LIS】
有一个程序员做过 n 个项目,他想要跳槽,因此他想要给面试官留下一个好印象。于是他想使自己看起来很有潜力也相应的会有竞争力,于是他决定从自己以前做过的N个成功或者失败的项目里不改变原来的时间顺序从中选择若干个项目,使得他展示出来的任意一个成功的项目之后都不会有一个失败的项目。这样一来,能够表现出他十足的潜力:尽管一开始做项目会失败,但一旦学会之后就不会再失败。具体的来说,给定一个含 n 个数字的“01”序列,如一个含5个数字的“01”序列:0 0 0 0 1,其中0代表失败的项目,1代表成功的项目。即第一个0代表第一个失败的项目,第二个0代表第二个失败的项目......最后一个1代表第五个成功的项目。于是如果这个程序员将选取一个原序列的一个子序列 0 0 0 0,满足上面他的要求:任意的数字1之后都没有数字0出现。程序员的目的是为了在满足上面的要求的条件下尽可能的展示最多的项目,请帮他算最多能展示多少个项目。

输入描述:

每组样例第一行为一个整数n,1<=n<=100,第二行为n项的01序列,每一项之间用一个空格隔开。

输出描述:

输出一个正整数,表示最多能展示的项目个数。
示例1

输入

4
1 1 0 1
6
0 1 0 0 1 0
1
0

输出

3
4
1
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    while(cin >> n)
    {
        int a[n], p[n];
        for (int i = 0; i < n; i++)
        {
            cin >> a[i];
            p[i] = 1;
        }

        for (int i = 0; i < n; i++)
            for (int j = 0; j < i; j++)
            {
               if (a[j] <= a[i])
                p[i] = max(p[i], p[j] + 1);
            }

            sort(p, p + n);
            cout << p[n-1] << endl;
    }
}
/*
4
1 1 0 1
6
0 1 0 0 1 0
1
0
*/