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

poj 2533 Longest Ordered Subsequence

2011-07-22 20:14 253 查看
#include<iostream>        //最长严格上升子序列(LIS)算法,时间复杂度为O(nlogn)
using namespace std;
int seq[1002];        //seq[i]是记录在所有最长严格上升子序列的长度为 i 之中,选取结束位置上最小的值
int main()
{
int n,p;
cin>>n>>p;
int rear=0;
seq[++rear]=p;
while(--n)
{
cin>>p;
if(p>seq[rear])        //当p==seq[rear],不能压入最长严格上升子序列中
seq[++rear]=p;
else
{
int s=1,t=rear,mid;        //在最长严格上升子序列中找到第一个大于p的数,并用p替换之。但如果有相同的元素已经在子序列出现,比如子序列是 3 4 , 要插入的值 p=3, 则子序列仍旧是 3 4 ,即插入的位置是相同的那个元素出现的位置(也就是不做任何改变)
while(s<t)
{
mid=(s+t)/2;
if(seq[mid]<p)
s=mid+1;
else                //当seq[mid]==p时, t=mid, 因为若有相同元素出现,p要替换的并不是比p大的那个数,而是相同的那个数(即不做改变)
t=mid;
}
seq[s]=p;
}
}
cout<<rear<<endl;        //最长严格上升子序列的长度
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: