• POJ


    d.最长上升子序列

    s.注意是严格递增

    c.O(nlogn)

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    
    const int MAXN=1005;
    int a[MAXN],b[MAXN];
    //b[k]是序列a中所有长度为k的递增子序列中的最小结尾元素值
    //用二分查找的方法找到一个位置,使得num>b[i-1]并且num<b[i],并用num代替b[i]
    int Search(int num,int low,int high){
        int mid;
        while(low<=high){
            mid=(low+high)/2;
            if(num>=b[mid])low=mid+1;
            else high=mid-1;
        }
        return low;
    }
    int DP(int n){
        int i,len,pos;
        b[1]=a[1];
        len=1;
        for(i=2;i<=n;i++){
            if(a[i]>b[len]){//如果a[i]比b[]数组中最大还大直接插入到后面即可
                len=len+1;
                b[len]=a[i];
            }
            else{//用二分的方法在b[]数组中找出第一个比a[i]大的位置并且让a[i]替代这个位置
                pos=Search(a[i],1,len);
                b[pos]=a[i];
            }
        }
        return len;
    }
    
    int main(){
    
        int N;
        int i;
    
        while(~scanf("%d",&N)){
            for(i=1;i<=N;++i){
                scanf("%d",&a[i]);
            }
    
            printf("%d
    ",DP(N));
        }
    
        return 0;
    }
    View Code

    c2.O(n^2)

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    
    #define MAXN 1005
    
    int a[MAXN];
    int dp[MAXN];//dp[i]表示以a[i]作为结尾的最长上升子序列的长度
    
    int main(){
    
        int N;
        int i,j;
        int temp;
        int ans;
    
        while(~scanf("%d",&N)){
    
            for(i=1;i<=N;++i){
                scanf("%d",&a[i]);
            }
    
            dp[1]=1;
    
            for(i=2;i<=N;++i){
    
                temp=0;
    
                for(j=1;j<i;++j){
                    if(a[i]>a[j]){
                        if(temp<dp[j]){
                            temp=dp[j];
                        }
                    }
                }
    
                dp[i]=temp+1;
            }
    
            ans=0;
            for(i=1;i<=N;++i){
                if(dp[i]>ans){
                    ans=dp[i];
                }
            }
    
            printf("%d
    ",ans);
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    HTTP状态详解
    表锁和行锁
    memcache 加载(对象)所遇到的问题。资源
    php 数据导出csv 注意问题。
    文件不存在的话创建文件 文件上传所遇到的问题、
    获取文件的后缀名。phpinfo
    手机访问pc网站自动跳转手机端网站代码
    计算机网络学习-20180826
    计算机网络学习-20180811
    集线器和交换机的区别
  • 原文地址:https://www.cnblogs.com/gongpixin/p/5288540.html
Copyright © 2020-2023  润新知