此题是一水题,注意数列的数可以取0。
可以优化为o(nlogn)。时间为16ms,可能优化的不太好。二分查找很有利用价值,写的还不错。
时间复杂度为n^2的。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int MAX =1010;
int a[MAX],d[MAX];
int main(){
int len;
while(~scanf("%d",&len)&&len)
{
int ans=0;
d[0]=0;
for(int i=1;i<=len;i++)
{
d[i]=1;
scanf("%d",&a[i]);
for(int j=1;j<i;j++)
{
if(d[i]<=d[j]&&a[i]>a[j])
{
d[i]=d[j]+1;
}
}
//printf("d[i]=%d\n",d[i]);
ans=ans<d[i]?d[i]:ans;
}
printf("%d\n",ans);
}
return 0;
}
时间复杂度为nlogn的。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int MAX =1010,INF=10001;
int a[MAX],d[MAX];
int binary_search(int digit ,int length)
{
int left=0,right=length,mid;
while(left!=right)
{
mid=(left+right)/2;
if(d[mid]==digit)
{
return mid;
}
else if(digit<d[mid])
right=mid;
else
left=mid+1;
}
return left;
}
int main(){
int len;
while(~scanf("%d",&len)&&len)
{
for(int i=1;i<=len;i++)
{
scanf("%d",&a[i]);
}
d[0]=-1;
int ans=1;
for(int i=1;i<=len;i++)
{
d[ans]=INF;
int t=binary_search(a[i],ans);
if(t==ans)
ans++;
d[t]=a[i];
}
printf("%d\n",ans-1);
}
return 0;
}