您的位置:首页 > 其它

LIS 求最长上升子序列长度

2017-03-07 08:04 417 查看
求最长上升子序列长度

#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN=5001;
int s[MAXN];
int main(int argc, char *argv[])
{
int n,i,x,l,r,mid;
int top=0;
s[0]=-1;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
if(x>s[top]) s[++top]=x;
else
{
l=0,r=top;
while(l<r)
{
mid=(l+r)/2;
if(x<=s[mid]) r=mid;
else l=mid+1;
}
s[l]=x;
}
}
printf("%d\n",top);
return 0;
}


求最长上升子序列(代码是我粘的,但我觉得还不错(我改过之后),纵使变量名难看,见下)

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int l;
int g[100010];
int d[100010];
int num[100010];
int main()
{
scanf("%d",&l);
memset(num,0,sizeof(num));
for(int i=0; i<l; i++)
scanf("%d",&num[i]);
fill(g,g+l,INF);
int max_=-1;
for(int i=0; i<l; i++)
{
int j=lower_bound(g,g+l,num[i])-g;
d[i]=j+1;
/*if(max_<d[i])
max_=d[i];这里可以改成求最长上升子序列*/
g[j]=num[i];
}
for(int i=0; i<l-1; i++)
printf("%d ",d[i]);
printf("%d\n",d[l-1]);
/* printf("%d\n",max_);*/
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: