Sample Input
4
1 2 2 3
Sample Output
4
代码
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define LL long long
using namespace std;
int a[1007];
int len[1007];
int main()
{
//freopen("in.txt","r",stdin);
int n,i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int cnt=0;
for(i=1;i<=n;i++)
{
int x=lower_bound(len+1,len+1+cnt,a[i])-len;//若为不减序列则用upper_bound
if(x<=cnt) len[x]=a[i];
if(x==cnt+1)
{
cnt++;
len[cnt]=a[i];
}
}
printf("%d\n",cnt);
return 0;
}
本文介绍了一种求解最长递增子序列问题的有效算法。通过使用二分查找结合动态规划的方法,在O(n log n)的时间复杂度内解决了该问题。代码示例展示了如何输入一组数并计算其最长递增子序列的长度。
1655

被折叠的 条评论
为什么被折叠?



