最长递增子序列(51Nod - 1134)

20180604 23:18

https://blog.csdn.net/joylnwang/article/details/6766317(写得很用心,膜拜dalao)

给出长度为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

思路:(upper_bound  and  lower_bound)https://blog.csdn.net/Quack_quack/article/details/48447293

⒈仿佛为我打开了新世界大门,首先,用常规方法做回超时,嗯...所以先一个一个读取数字,因为是求的最长上升子序列,所以用STL里面的upper_bound直接把比原先在数组里的数大的后输入的数的坐标(?)传输给L,最后L的长度就是要求的最长上升子序列的值。

ps:代码是由学长提供(https://www.cnblogs.com/hua-dong/p/9133827.html)

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<iostream>
 4 #include<cstdio>
 5 #include<cstdlib>
 6 #include<iostream>
 7 #include<algorithm>
 8 #include<cstring>
 9 #include<string>
10 #include<cmath>
11 using namespace std;
12 int a[100010];
13 int main()
14 {
15     int n,x,i,L=0,pos=0;
16     scanf("%d",&n);
17     for(i=1;i<=n;i++){
18         scanf("%d",&x);
19         pos=upper_bound(a+1,a+L+1,x)-a;//格式啊.注意事项1.下标都是下标.
20         a[pos]=x;// 2.把数放进去,然后判断:如果x比现有的数都大pos返回的是L+1;
21         L=max(L,pos);// 3.但是运行到一半发现找到组织了(及x此时不是这一波中最大的数)那么x被淘汰.数组依旧长度为L(这是上一把的长度).
22     }
23     cout<<L<<endl;
24     return 0;
25 }

给出长度为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 <= Sii <= 10^9)Output输出最长递增子序列的长度。Sample Input

8
5
1
6
8
2
4
5
10

Sample Output

5

猜你喜欢

转载自www.cnblogs.com/chuixulvcao/p/9136656.html
今日推荐