hdu 1950 最长上升子序列

 1 //Accepted    3540 KB    62 ms
 2 //dp 最长上升子序列
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <iostream>
 6 using namespace std;
 7 const int imax_n = 400005;
 8 int dp[imax_n];
 9 int d[imax_n];
10 int a[imax_n];
11 int n;
12 int len;
13 int max(int a,int b)
14 {
15     return a>b?a:b;
16 }
17 int binary_search(int k)
18 {
19     int l=0;
20     int r=len;
21     while (l<=r)
22     {
23         int mid=(l+r)/2;
24         if (d[mid]==k) return mid;
25         if (d[mid]<k) l=mid+1;
26         if (d[mid]>k) r=mid-1;
27     }
28     return l;
29 }
30 void Dp()
31 {
32     memset(dp,0,sizeof(dp));
33     memset(d,0,sizeof(d));
34     len=-1;
35     for (int i=0;i<n;i++)
36     {
37         int j=binary_search(a[i]);
38         if (j>len) len++;
39         dp[i]=j+1;
40         d[j]=a[i];
41     }
42     int ans=0;
43     for (int i=0;i<n;i++)
44     ans=max(ans,dp[i]);
45     printf("%d\n",ans);
46 }
47 int main()
48 {
49     int T;
50     scanf("%d",&T);
51     while (T--)
52     {
53         scanf("%d",&n);
54         for (int i=0;i<n;i++)
55         scanf("%d",&a[i]);
56         Dp();
57     }
58     return 0;
59 }

hdu 1950 最长上升子序列

时间: 2024-07-31 17:16:05

hdu 1950 最长上升子序列的相关文章

HDU 1243 最长公共子序列

反恐训练营 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2850    Accepted Submission(s): 648 Problem Description 当今国际反恐形势很严峻,特别是美国“9.11事件”以后,国际恐怖势力更是有恃无恐,制造了多起骇人听闻的恐怖事件.基于此,各国都十分担心恐怖势力会对本国社会造成的不稳定,

NYOJ 36 &amp;&amp;HDU 1159 最长公共子序列(经典)

链接:click here 题意:tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列. 输入 第一行给出一个整数N(0<N<100)表示待测数据组数 接下来每组数据两行,分别为待测的两组字符串.每个字符串长度不大于1000. 输出 每组测试数据输出一个整数,表示最长公共子序列长度.每组

HDU 5784 最长上升子序列的长度nlgn(固定尾部)

Bellovin Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 858    Accepted Submission(s): 395 Problem Description Peter has a sequence a1,a2,...,an and he define a function on the sequence -- F(

HDU 1025 最长上升子序列

首先根据第一个数排序,然后可以得到一串第二个数组成的序列,因为第一个由大到小排列,所以第二组中取到的数据,后面的不能比前面的小才不会形成交叉,那么也就是求这个新序列的最长公共子序列 这里要用到最长上升子序列的nlogn的算法,新建一个数组保存所有合理的数据的数组g,比如g数组中有了1,4,6,加进来一个3 , 那么4可以被3代替因为在同一个位置尽可能小能容纳的数据个数就会越多,越能找到更长的序列,这个找位置的过程就用二分搜索logn的复杂度 注意一点,我是因为这个好久没做出....就是边数大于1

hdu 5773 最长递增子序列 (nlogn)+贪心

The All-purpose Zero Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 947    Accepted Submission(s): 453 Problem Description ?? gets an sequence S with n intergers(0 < n <= 100000,0<= S[i] &l

HDU 1159 最长公共子序列(n*m)

Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 32693    Accepted Submission(s): 14786 Problem Description A subsequence of a given sequence is the given sequence with some el

HDU 5773 最长上升子序列

题意 给出一个序列 问它的最长严格上升子序列多长 这个序列中的0可以被替代为任何数 n的范围给出了1e5 所以平常的O(n*n)lis不能用了 在kuangbin的模板里有O(nlogn)的模板 套上就可以过了 但是比赛的时候没有拿模板= =. 于是就想出了另外一个时间复杂度不明的办法= =. 将序列从前往后扫 设定一个数组a a[i]=z a[i]为当前i长度的上升子序列中的最小的尾数的大小 maxl为当前找出的最长的子序列长度 每次我们扫到一个数 都对0-maxl长度的a[i]进行判断 看能

HDU 1159 最长公共子序列

Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 53443    Accepted Submission(s): 24607 Problem Description A subsequence of a given sequence is the given sequence with some el

hdu 5747 最长上升子序列 (nlogn)

ac code: #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; typedef long long ll; #define INF 1e9 #define maxn 100005 int a[maxn]; //记录原序列 int d[maxn]; //d[k] 表示长度为k的上升子序列结尾的最小值 int f