/*
NYoj 214 单调递增子序列(二)
相当于(一)的时间优化.
并且应用了二分.
也有动态规划的意思吧!
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string.h>
using namespace std;
int a[100010];
int b[100010];//b用来存储当前状态的最优串.
//比如abef和abcd,abcd为最优串,而以后的更新只需要最优串.
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
b[1]=a[0];
int length=1;
int l,r,mid;
for(int i=1;i<n;i++)
{
l=1;r=length;
while(l<=r)
{
mid=(l+r)/2;
if(b[mid]<a[i]) l=mid+1;
else r=mid-1;
}
b[l]=a[i];
if(l>length) length++;//新增的,说明最优串的长度变长了.
}
printf("%d\n",length);
}
}
b数组中,得到的不的最后ans的子序列。这一点要清楚的明白。
这种二分的方法只能求得,最长的长度。
NYoj 214 单调递增子序列(二)[动态规划+二分]
最新推荐文章于 2020-12-05 20:33:24 发布