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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章