POJ 2533 Longest Ordered Subsequence

简介: POJ 2533 Longest Ordered Subsequence

Description


A numeric sequence of ai is ordered if a1 < a2 < … < aN. Let the subsequence of the given numeric sequence (a1, a2, …, aN) be any sequence (ai1, ai2, …, aiK), where 1 <= i1 < i2 < … < iK <= N. For example, sequence (1, 7, 3, 5, 9, 4, 8) has ordered subsequences, e. g., (1, 7), (3, 4, 8) and many others. All longest ordered subsequences are of length 4, e. g., (1, 3, 5, 8).


Your program, when given the numeric sequence, must find the length of its longest ordered subsequence.

Input


The first line of input file contains the length of sequence N. The second line contains the elements of sequence - N integers in the range from 0 to 10000 each, separated by spaces. 1 <= N <= 1000

Output


Output file must contain a single integer - the length of the longest ordered subsequence of the given sequence.

Sample Input


7

1 7 3 5 9 4 8

Sample Output


4


用动态规划做,每次从后面对前面判断

用dd[k]表示以df[k]作为终点的最大上升子序列

则:

dd[1] = 1;

dd[k] = Max (dd[i]:1 <= i < k 且 df[i ]< df[k] 且 k != 1) + 1.

也就是第k+1前面一个不大于df[k]的数的dd[ ]的值;

n:7

i :0 1 2 3 4 5 6

df :1 7 3 5 9 4 8

dd[0]:1;

dd[1]:dd[0]+1=2;

dd[2]:dd[0]+1=2;

dd[3]:dd[2]+1=3;

dd[4]:因为df[0],df[1],df[2],df[3]都小于df[4],但是dd[3]最大,

所以,dd[4]=dd[3]+1=4;

dd[5]:dd[2]+1=3;

dd[6]:dd[5]+1=4;

…………………………………………………………

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Maxn 1020
int df[Maxn],dd[Maxn];
int cmp(const void *x,const void *y){
    return (*(int *)y-*(int *)x);
    /*快速排序,从大到小排序*/
}
int main(){
    int n;
    while(scanf("%d",&n)==1){
        for(int i=0;i<n;i++){
            scanf("%d",&df[i]);
        }
        dd[0]=1;
        for(int i=1;i<n;i++){
                int t=0;
            for(int j=0;j<i;j++){
                if(df[i]>df[j]){
                    if(t<dd[j]){
                        t=dd[j];
                    }
                }
            }
            dd[i]=t+1;
            //此时的t是dd[i]之前的最大增子序列的个数
        }
        qsort(dd,n,sizeof(int),cmp);
        printf("%d\n",dd[0]);
    }
    return 0;
}
目录
相关文章
|
8月前
Knight Moves(POJ2243)
Knight Moves(POJ2243)
|
Java
hdu 1022 Train Problem I【模拟出入栈】
hdu 1022 Train Problem I【模拟出入栈】
53 0
hdu 1022 Train Problem I【模拟出入栈】
|
C++
poj 2182 Lost Cows(树状数组)
FJ有n头牛,现在它们排成一排,每一头牛都有一个不同的编号(1-n),现在知道从第二头牛开始每头牛左边比自己编号小的牛的数目,让你确定每头牛的编号。
47 0
UVa11136 Hoax or what(multiset)
UVa11136 Hoax or what(multiset)
62 1
UVa11296 - Counting Solutions to an Integral Equation(枚举技巧)
UVa11296 - Counting Solutions to an Integral Equation(枚举技巧)
55 0
LeetCode 279. Perfect Squares
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
75 0
LeetCode 279. Perfect Squares
|
算法 索引
LeetCode 214. Shortest Palindrome
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。
99 0
LeetCode 214. Shortest Palindrome
UVA439-骑士的移动 Knight Moves(BFS)
UVA439-骑士的移动 Knight Moves(BFS)
UVA439-骑士的移动 Knight Moves(BFS)
HDU-2602,Bone Collector(01背包)
HDU-2602,Bone Collector(01背包)