您的位置:首页 > 其它

hdu 5421 小明系列问题——小明序列(LIS最长上升子序列)

2016-07-29 18:17 471 查看
/*****************************************************
题目:     小明系列问题——小明序列(hdu 4521)
链接:     http://acm.hdu.edu.cn/showproblem.php?pid=4521 算法:     LIS最长上升子序列

******************************************************/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;

const int mx=100005;
int d[mx],dp[mx],a[mx];
queue<int>q;

int BinSerch(int l,int r,int cut)
{
while (l<=r)
{
int m=(l+r)>>1;
if (cut>d[m]&&cut<=d[m+1]) return m;
if (cut>d[m]) l=m+1;
else r=m-1;
}
return 0;
}

int LIS(int n,int k)
{
int len=1,j;
fill(d,d+n+3,mx);
d[1]=a[0];
for (int i=k+1;i<n;i++)
{
if (a[i]>d[len]) j=len+1;
else j=BinSerch(1,len,a[i])+1;
dp[i]=j;
q.push(i);

int cut=q.front();

q.pop();
d[dp[cut]]=min(a[cut],d[dp[cut]]);
len=max(len,dp[cut]);
}
while (!q.empty())
{
int cut=q.front();
q.pop();
len=max(len,dp[cut]);
}
return len;
}

int main()
{
int n,d;
while (~scanf("%d%d",&n,&d))
{
while (!q.empty()) q.pop();
for (int i=0;i<n;i++) scanf("%d",&a[i]);
for (int i=1;i<=d;i++)
{
dp[i]=1;
q.push(i);
}
printf("%d\n",LIS(n,d));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: