算法:
记为以
结尾的最长上升子序列长度,
对于每个更新
for(int i=1;i<=n;i++)f[i]=1;
for(int j=2;j<=n;j++)
for(int i=1;i<j;i++)
if(a[i]<a[j])
f[j]=max(f[j],f[i]+1);
for(int i=1;i<=n;i++)
Ans=max(Ans,f[i]);
算法:
记为当前长度为
结尾的上升子序列的末尾元素中最小的一个.
可以保证序列单调.
从左到右扫一遍,为当前正常上升子序列长度.
对于新的,若
,则更新
否则二分查找最后一个小于的后一个位置,设为
,
则.则可以将
替换为
,
且替换了一定更优.
f[1]=a[1];int lon=1;
for(int i=2;i<=n;i++){
if(a[i]>f[lon])f[++lon]=a[i];
else {
int l=1,r=lon;
while(l<r){
int mid=(l+r)>>1;
if(f[mid]<a[i])l=mid+1;
else r=mid;
}
f[l]=a[i];
}
}
Ans=lon;
最长下降: 互换
最长不降/升: ,
互换,
,
互换

京公网安备 11010502036488号