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 <= Si <= 10^9)Output输出最长递增子序列的长度。Sample Input
8 5 1 6 8 2 4 5 10
Sample Output
5