Lis--Lnds--Lds--Lnis & Dliworth
用vector模拟队列:贪心+二分--最后vct.size()则为最长子序列的长度
1.Lis(最长上升子序列):
遍历每一个数字x,若x>vct中最后一个数字,直接加入;否则lower_bound找到第一个>=x的数字,并替换为x;
2.Lnds(最长非降子序列):
遍历每一个数字x,若x>=vct中最后一个数字,直接加入;否则upper_bound找到第一个>x的数字,并替换为x;
3.Lds(最长下降子序列):
遍历每一个数字x,若x<vct中最后一个数字,直接加入;否则lower_bound找到第一个<=x的数字,并替换为x;
4.Lnis(最长非升子序列):
遍历每一个数字x,若x<=vct中最后一个数字,直接加入;否则upper_bound找到第一个<x的数字,并替换为x; --upper_bound( vct.begin(),vct.end(),arr[i],greater<int>() ); 从大到小排序,即可找到第一个比x小到数字
int arr1[500]={1,2,3,4,5,6,7,8,9};
cout<<*upper_bound(arr1,arr1+10,6)<<"\n"; //递增-找第一个比x大的数字的位置;递增不能加greater<int>() out:6
int arr[500]={9,8,7,6,5,4,2,3,1};
cout<<*upper_bound(arr,arr+10,6, greater<int>() ); //递减+greater<int>() 找第一个比x小的数字的位置;递减不能加less<int>() out:5