#include

1134 最长递增子序列(容易TLE)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1134

1134 最长递增子序列(51NOD基础)(容易TLE)
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题

给出长度为N的数组,找出这个数组的最长递增子序列。(递增子序列是指,子序列的元素是递增的)
例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10。
Input

第1行:1个数N,N为序列的长度(2 <= N <= 50000)
第2 - N + 1行:每行1个数,对应序列的元素(-10^9 <= S[i] <= 10^9)

Output

输出最长递增子序列的长度。

Input示例

8
5 1 6 8 2 4 5 10

Output示例

5

TLE代码:复杂度 O(n*n)

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ; 

#define LL long long 

int main(){
    int n ; 
    LL num[50050] ; 
    int dp[50050] ; 

    
    while(~scanf("%d" , &n)){
        memset(dp , 0 , sizeof(dp)) ; 
        memset(num , 0 , sizeof(num)) ; 
        
        for(int i=0 ; i<n ; i++){
            scanf("%lld" , &num[i]) ; 
        }
        int max_len = 0 ; 
        for(int i=0 ; i<n ; i++){
            dp[i] = 1 ; 
            for(int j=0 ; j<i ; j++){
                if(num[i] > num[j]){
                    dp[i] = max(dp[i] , dp[j] + 1) ; 
                }
            }
            max_len = max(max_len , dp[i]) ; 
        }
        
    
        printf("%d\n", max_len) ; 
    } 
    return 0 ; 
    
}

AC代码:

思路:每次 插入vis数组中(替换掉第一个比要插入数大的数字) 或者新添加到 vis 数组最后

    vis 数组的长度(vis中有效的数字元素个数)就是答案

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <limits>
using namespace std ; 

#define maxn 50000+ 50
int num[maxn] ; 
int vis[maxn] ; //vis[i]表示长度为i的数列中最小的末尾值

int main(){
    int n ; 
    while(~scanf("%d" , & n )){
        int len = 1 ; 
        for(int i=0 ; i<n ; i++){
            scanf("%d" , &num[i]) ; 
        }
        for(int i=0 ; i<n ; i++){
            vis[i] = INT_MIN ; 
        }
        vis[1] = num[0] ; //
        for(int i=1 ; i<n ; i++){
        // = 号 后面是 upper_bound () 函数的 使用姿势
        // 返回数组中 第一个比 num[i] 大的数在 数组中的下标 没有就返回数组最后一个元素的 下标加一 
            int pos = upper_bound(vis+1 , vis+len+1 , num[i]) - vis ; 
            
            vis[pos] = num[i] ; 
            if(len < pos)//维护最大长度
            len = pos ; 
        }
        
        printf("%d\n" , len ) ; 
    }
    return 0 ; 
}

 

posted @ 2017-09-22 23:42  0一叶0知秋0  阅读(191)  评论(0编辑  收藏  举报