您的位置:首页 > 其它

Stock Exchange(LIS最长上升子序列问题)

2015-08-15 16:44 405 查看
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87125#problem/E

题意:

输入L,再输入长为L的序列,找出最长上升子序列的长度。注意选出的上升子序列中相邻元素不能相等。

案例:

input

6

5 2 1 4 5 3

3

1 1 1

4

4 3 2 1

output

3

1

1

思路分析:

找出比前一个数大的数存入数组,如果小于放到前面,替换比它大一点的数,直到找出最长子序列,输出maxn。

源代码如下:

#include<iostream>
#include<cstdio>
#define MAX 100005
using namespace std;
int main()
{
int L,i,a,d[MAX],maxn;
while(scanf("%d",&L)!=EOF)
{
maxn=0;
d[0]=-1;
for(i=0;i<L;i++)
{
scanf("%d",&a);
if(a>d[maxn])
d[++maxn]=a;            //储存
else
{
int x=1,y=maxn,mid;
while(x<=y)              //替换
{
mid=(x+y)>>1;
if(a>d[mid])
x=mid+1;
else
y=mid-1;
}
d[x]=a;
}
}
printf("%d\n",maxn);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: