pku 2533 Longest Ordered Subsequence (DP)

pku 2533 Longest Ordered Subsequence (DP)
最长递增子序列问题。

O(n^2)

DP。 练练手

#include  < iostream >

using   namespace  std;

const   int  MAX  =   1005 ;

int  A[MAX],F[MAX];
int  N, ans =- 1 ;

int  main() {
    
int i,j;
    scanf(
"%d"&N);
    
for(i=1; i<=N; ++i)
        scanf(
"%d"&A[i]);

    
for(i=N; i>=1--i){
        F[i]
=1;
        
for(j=i+1; j<=N; ++j)
            
if(A[j]>A[i] && F[j]+1>F[i])
                F[i]
=F[j]+1;
        
if(F[i]>ans)
            ans 
= F[i];
    }


    printf(
"%d\n", ans);
    
return 0;
}


O(nlgn)
开一个栈,每次取栈顶元素top和读到的元素temp做比较,如果temp > top 则将temp入栈;如果temp < top则二分查找栈中的比temp大的第1个数,并用temp替换它。 最长序列长度即为栈的大小top。

#include  < iostream >

using   namespace  std;

const   int  MAX  =   1005 ;

int  stack[MAX];
int  N, ans =- 1 ;

int  main() {
    
int i, tmp, top;
    scanf(
"%d"&N);

    stack[top
=0]=-1;
    
for(i=1; i<=N; ++i){
        scanf(
"%d"&tmp);
        
if(tmp>stack[top]){
            stack[
++top] = tmp;
        }
else{
            
int low=1, high=top;
            
while(low<=high){
                
int mid=(low+high)/2;
                
if(tmp>stack[mid])
                    low 
= mid+1;
                
else
                    high 
= mid-1;
            }

            stack[low]
=tmp;
        }

    }


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

    
return 0;
}

你可能感兴趣的:(pku 2533 Longest Ordered Subsequence (DP))