POJ1887 最长下降子序列

这道题就是很裸的一个最长下降子序列,算法类似最长上升子序列。最长上升子序列算法链接:

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



posted @ 2015-08-31 18:52  Zeroinger  阅读(195)  评论(0编辑  收藏  举报
无觅关联推荐,快速提升流量