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

  

 

posted @ 2023-11-30 10:40  osir  阅读(0)  评论(0编辑  收藏  举报