这道题就是很裸的一个最长下降子序列,算法类似最长上升子序列。最长上升子序列算法链接:
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:代码ACMPOJ1887.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: ",++k); printf(" maximum possible interceptions: %d ",len); } return 0; }