复杂度O(n*log(n))
求a[i]的最长不下降子系列的长度
d[i]:表示长度为i的最末位的最小值
我画了好好好好久,就是如果a[i]不小于d[cnt]时,d[++cnt]=a[i],反之就用二分找到那个刚好大于当前a[i]的d[k]值把d[k]替换成a[i];
for(int i=1;i<=n;i++)
if(a[i]>=d[cnt])d[++cnt]=a[i];
else
{
int k=upper_bound(d+1,d+cnt+1,a[i]);
d[k]=a[i];
}
答案:cnt
我还有一道不算很版题的版题(里面用的手打二分没用upper_bound)
复杂度O(n*n)
用DP
f[i]:表示以a[i]结尾的最长序列长度
for(int i=1;i<=n;i++)
{
f[i]=1;
for(int j=1;j<i;j++)
if(a[i]>=a[j])f[i]=max(f[j]+1,f[i]);
ans=max(ans,f[i]);
}
答案:ans