您的位置:首页 > 产品设计 > UI/UE

POJ 2533 Longest Ordered Subsequence

2014-04-06 11:23 513 查看
题目描述:LIS(Longest Increasing Subsequence)模板题

分析:O(n^2)的方法

状态表示:d[i]表示以i结尾的最长上升子序列长度

转移方程:d[i]=max{ 1,d(j)+1 } ( j=1,2,3,...,i-1且A[j]<A[i] )

即A[j]<A[i],d[i]=d[j]+1

A[j]>=A[i],d[i]=1

#include<cstdio>
int main()
{
int N,a[10005],d[10005];
scanf("%d",&N);
for(int i=0;i<N;i++)
scanf("%d",&a[i]);
int max=0;
for(int i=0;i<N;i++)
{
d[i]=1;
for(int j=0;j<i;j++)
{
if(a[j]<a[i]&&d[j]+1>d[i])
d[i]=d[j]+1;
}
if(d[i]>max)  max=d[i];
}
printf("%d\n",max);
return 0;
}


O(nlogn)的方法:

#include<cstdio>
#include<algorithm>
using namespace std;
const int INF=1000000000;
int N,a[10005],d[10005],g[10005];
int main()
{
scanf("%d",&N);
for(int i=0;i<N;i++)
scanf("%d",&a[i]);
for(int i=1;i<=N;i++) g[i]=INF;
int ans=0;
for(int i=0;i<N;i++)
{
int k=lower_bound(g+1,g+1+N,a[i])-g;
d[i]=k;
g[k]=a[i];
ans=max(ans,d[i]);
}
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: