最长上升子序列

最长上升子序列

Time Limit: 3000 ms Memory Limit: 65536 KiB

Problem Description

一个数的序列bi,当b 1 < b 2 < ... < b S的时候,我们称这个序列是上升的。对于给定的一个序列(a 1, a 2, ..., a N),我们可以得到一些上升的子序列(a i1, a i2, ..., a iK),这里1<= i 1 < i 2 < ... < i K <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8)。

你的任务,就是对于给定的序列,求出最长上升子序列的长度。

Input

输入的第一行是序列的长度N (1 <= N <= 1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000。

Output

最长上升子序列的长度。

Sample Input

7
1 7 3 5 9 4 8

Sample Output

4


#include<stdio.h>


int w[10001] = {0}, a[100001];


int main(void)
{
    int i, n, j, m, max = -1;


    scanf("%d", &n);


    for(i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
    }


    w[1] = 1;


    for(i = 1; i <= n; i++)
    {
        m = 0;  //m用来每次从头开始判断大小的媒介


        for(j = 1; j <= i; j++)
        {
            if(a[i] > a[j])
            {
                if(m < w[j])  //因为可能有好几个数比它小,所以就要看看那个小数的w[j]大,然后用大的那个加上去
                {
                    m = w[j];  //重要的思想
                }
            }
        }


        w[i] = m + 1;  //最后加上它本身
    }


    for(i = 1; i <= n; i++)
    {
        if(max < w[i])
        {
            max = w[i];  //因为只是找一个最大值,所以没必要进。行排序,直接用这样的方法来做即可
        }
    }


    printf("%d\n", max);


    return 0;
}

猜你喜欢

转载自blog.csdn.net/eider1998/article/details/80142805