首页 > 其他 > 详细

最长不递减子序列

时间:2019-09-10 20:36:00      阅读:81      评论:0      收藏:0      [点我收藏+]

定义:在最长上升序列的基础上,允许相同的若干元素出现在子序列中

DP做法:

 

 1 //DP
 2 int LDNS(int a[], int n)
 3 {
 4     int DP[n];
 5     int Cnt=-1;
 6     memset(DP, 0, sizeof(DP));
 7     for(int i=0; i<n; i++ )
 8     {
 9         for(int j=0; j<i; j++ )
10         {
11             if( a[i]>=a[j] )//和最长子序列的区别之处
12             {
13                 DP[i]=max(DP[i], DP[j]+1);
14                 Cnt=max(Cnt, DP[i]);
15             }
16         }
17     }
18     return Cnt+1;
19 }

 

 

 

贪心+二分法:

注意:把在“最长子序列”里的lower_bound改为upper_bound,原因是lower_bound返回的是第一个大于等于a[i]的地址,在允许子序列有重复元素时可能会造成相同元素覆盖,使得求得的长度变短

 1 1 int LDNS(int a[], int n)
 2  2 {
 3  3     int Cnt=0;
 4  4     int Array[n+1];
 5  5     Array[0]=a[0];
 6  6     for(int i=1; i<n; i++ )
 7  7     {
 8  8         if( a[i]>=Array[Cnt] )
 9  9             Array[++Cnt]=a[i];
10 10             else
11 11             {
12 12                 int Index=upper_bound(Array, Array+Cnt+1, a[i])-Array;
13 13                 Array[Index]=a[i];
14 14             }
15 15     }
16 16     return Cnt+1;
17 17 }

 

最长不递减子序列

原文:https://www.cnblogs.com/wsy107316/p/11502628.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!