这道题就是很裸的一个最长下降子序列,算法类似最长上升子序列。最长上升子序列算法链接:
1:http://blog.csdn.net/z_zhangyinqian/article/details/47859617
2:http://blog.csdn.net/z_zhangyinqian/article/details/47980725
这里用了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[n]=-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;
}