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
     1 #include<bits/stdc++.h>
     2 #define lowbit(x) x&(-x)
     3 using namespace std;
     4 int n,t,a[400001],sum[400001],f[400001];
     5 void add(int x,int val) {
     6     while(x<=n) {
     7         sum[x]=max(sum[x],val);
     8         x+=lowbit(x);
     9     }
    10 }
    11 int ask(int x) {
    12     int ans=INT_MIN;
    13     while(x) {
    14         ans=max(sum[x],ans);
    15         x-=lowbit(x);
    16     }
    17     return ans;
    18 }
    19 int main() {
    20     scanf("%d",&t);
    21     while(t--) {
    22         int ans=INT_MIN;
    23         memset(sum,0,sizeof(sum));
    24         memset(f,0,sizeof(f));
    25         scanf("%d",&n);
    26         for(int i=1; i<=n; i++)
    27             scanf("%d",&a[i]);
    28         for(int i=1; i<=n; i++) {
    29             int num=-1;
    30             num=max(ask(a[i]),num);
    31             f[i]=num+1;
    32             add(a[i],f[i]);
    33         }
    34         for(int i=1; i<=n; i++)
    35             ans=max(ans,f[i]);
    36         printf("%d
    ",ans);
    37     }
    38     return 0;
    39 }
  • 相关阅读:
    一文解读RESTful (转)
    一文解读Redis (转)
    一文解读JSON (转)
    一文解读单点登录 (转)
    一文解读雪碧图 (转)
    一文解读骨架屏 (转)
    一文解读MPA/SPA(转)
    一文解读HTTP2 (转)
    一文解读HTTP (转)
    HTML5中Video标签无法播放mp4的解决办法
  • 原文地址:https://www.cnblogs.com/sbwll/p/13383621.html
Copyright © 2011-2022 走看看