您的位置:首页 > 其它

最长递增公共子序列(二)

2017-03-24 16:31 239 查看
/*描述

给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序列,并求出其长度。

如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5。

输入

有多组测试数据(<=7)

每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的下一行里有n个整数,表示数列中的所有元素.每个整形数中间用空格间隔开(0<n<=100000)。

数据以EOF结束


输入数据保证合法(全为int型整数)!

输出

对于每组测试数据输出整形数列的最长递增子序列的长度,每个输出占一行。

样例输入

7

1 9 10 5 11 2 13

2

2 -1

样例输出

5

1*/

#include <iostream>

#include <cstdio>

using namespace
std;

int main() {

    int n;

    int a[100001];

    int sum[100001];

    while (scanf("%d",&n)!=EOF)
{

        for(int i=0;i<n;i++)

        {

            scanf("%d",&a[i]);

            sum[i]=1;

        }

        for(int i=0;i<n;i++)

            for(int j=i+1;j<n;j++)

        {

            if(a[j]>a[i])

            {

                if(sum[j]>1+sum[i]) sum[j]=sum[j];

                else sum[j]=1+sum[i];

            }

        

        }

        for(int i=0;i<n;i++)

        {

            if(sum[0]<sum[i])

                sum[0]=sum[i];

        }

        printf("%d\n",sum[0]);

        

    }

    return
0;

}

我直接用线型动态规划,然而超时了,都是泪,大佬们说要用二分法,我下次试试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM
相关文章推荐