#include<stdio.h>
int main()
{
int n;
int hei[100057];
int z[100057];
int res=0;
int i,j,k;
while(~scanf("%d",&n))
{
for(i=0;i<n;++i)
{
scanf("%d",&hei[i]);
k=1;
for(j=0;j<i;++j)
if(hei[i]>hei[j])
k=k-1<z[j]?z[j]+1:k;
z[i]=k;
res=res<k?k:res;
}
printf("%d\n",res);
res=0;
}
return 0;
}
最长上升子序列的长度和最长不下降子序列的个数相等
#include<stdio.h>
int main()
{
int n;
int hei[100057];
int l,r,m;
int i,j,k;
while(~scanf("%d",&n))
{
j=0;
for(i=0;i<n;++i)
{
scanf("%d",&hei[j]);
l=0,r=j;
while(l<r)
{
m=(l+r)/2;
if(hei[m]>hei[j]) l=m+1;
else r=m;
}
hei[l]=hei[j];
j=l==j?j+1:j;
}
printf("%d\n",j);
}
return 0;
}
每一枚后面的导弹使用能拦截这枚导弹的最低系统
算法《最长上升子序列》
算法《折半查找》