您的位置:首页 > 其它

POJ1887 最长下降子序列

2015-08-31 18:52 302 查看
这道题就是很裸的一个最长下降子序列,算法类似最长上升子序列。最长上升子序列算法链接:

1:/article/7860548.html

2:/article/7860550.html

这里用了n*logn的算法,代码如下:

/* **********************************************
Auther: zyq_zhang
Created Time: 2015/8/31 18:49:23
File Name   : F:\代码\ACM\POJ1887.cpp
*********************************************** */
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=10010;
const int INF=40000;
int a[maxn],dp[maxn];
int find(int l,int r,int x)
{
while(l<=r)
{
int mid=(l+r)>>1;
if(dp[mid]>=x) l=mid+1;
else
r=mid-1;
}
return l;
}
int main()
{
int x,n,k=0;
while(scanf("%d",&x)&&x!=-1)
{
a[1]=x;
dp[1]=-INF;
n=1;
while(scanf("%d",&x)&&x!=-1)
{
a[++n]=x;
dp
=-INF;
}
int j=0,len=0;
dp[0]=INF;
for(int i=1;i<=n;i++)
{
if(a[i]<dp[len]) j=++len;
else
j=find(1,len,a[i]);
dp[j]=max(dp[j],a[i]);
}
printf("Test #%d:\n",++k);
printf("  maximum possible interceptions: %d\n\n",len);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: