poj 2533 Longest Ordered Subsequence

#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;

}

posted on 2011-07-22 20:14  sysu_mjc  阅读(100)  评论(0编辑  收藏  举报

导航