zoukankan      html  css  js  c++  java
  • 最长上升子序列加强版

    . 最长上升子序列加强版

    描述

    给出N个数,它们各不相同,求最长上升子序列

    输入

    先给出一个数字N,代表有N组数据
    对于每组数据,先给出一个数字TOT,TOT小于等于40000.
    接下来有TOT个数字,为1到40000的某个排列.

    输出

    针对每组数据,输出最长上升序列的长度

    样例

    输入

    复制
    4
    6
    4
    2
    6
    3
    1
    5
    10
    2
    3
    4
    5
    6
    7
    8
    9
    10
    1
    8
    8
    7
    6
    5
    4
    3
    2
    1
    9
    5
    8
    9
    2
    3
    1
    7
    4
    6

    输出

    复制
    3
    9
    1
    4
    #include<bits/stdc++.h>
    using namespace std;
    const int N=40000+20;
    int a[N],ans=1,c[N],h[N];
    int lowbit(int x) {
        return x&(-x);
    }
    void insert(int x,int vol) {
        while(x<=N) {
            c[x]=max(c[x],vol);
            x+=lowbit(x);
        }
    }
    int ask(int x) {
        int sum=0;
        while(x) {
            sum=max(sum,c[x]);
            x-=lowbit(x);
        }
        return sum;
    }
    int main() {
        int t;
        cin>>t;
        while(t--) {
            memset(c,0,sizeof(c));
            ans=0;
            int n;
            cin>>n;
            for(int i=1; i<=n; i++)
                cin>>a[i];
            for(int i=1; i<=n; i++) {
                 h[i]=ask(a[i])+1;
    //            for(int k=1;k<=N;k++)
    //            cout<<c[k]<<" ";
    //            cout<<endl;
    //            cout<<h[i]<<" daan"<<endl;
                insert(a[i]+1,h[i]);
                ans=max(ans,h[i]);
            }
    
            cout<<ans<<endl;
        }
    }
  • 相关阅读:
    HDU 1114 Piggy-Bank
    HDU 2955 Robberies
    NTOJ 290 动物统计(加强版)
    POJ 3624 Charm Bracelet
    HDU 2602 Bone Collector
    POJ 1523 SPF(无向图割顶)
    HDU 5311 Hidden String
    HDU 1421 搬寝室
    HDU 1058 Humble Numbers
    POJ 3259 Wormholes(spfa判负环)
  • 原文地址:https://www.cnblogs.com/cwjr/p/13381054.html
Copyright © 2011-2022 走看看