定义:在最长上升序列的基础上,允许相同的若干元素出现在子序列中
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