pku 1836 2*LIS[O(nlogn)]

#include <iostream>
using namespace std;

class MAXLINE
{
public:
 void init(int);
 void DP();
 int LIS(int, int, bool);
private:
 double L[1010];
 int len;
};

void MAXLINE::init(int n)
{
 len = n;
 int i;
 for (i = 0; i < len; ++i)
 {
  scanf("%lf", &L[i]);
 }
 DP();
}

void MAXLINE::DP()
{
 int i, max = -99;
 for (i = 0; i < len-1; ++i)
 {
  int result = LIS(0,i,true) + LIS(i+1,len-1,false);
  if (max < result)
  {
   max = result;
  }
 }
 printf("%d\n", len - max);
}

int MAXLINE::LIS(int begin, int end, bool flag)
{
 double binary[1010];
 if (flag)
 {
  binary[0] = -99;
 }
 else
 {
  binary[0] = 99;
 }
 binary[1] = L[begin];
 int low, high, mid, len, i;
 len = 1;
 for (i = begin+1; i <= end; ++i)
 {
  low = 0;
  high = len;
  while (low <= high)
  {
   mid = (low+high)/2;
   if (flag)
   {
    if (binary[mid] < L[i])
    {
     low = mid + 1;
    }
    else
    {
     high = mid - 1;
    }
   }
   else
   {
    if (binary[mid] > L[i])
    {
     low = mid + 1;
    }
    else
    {
     high = mid - 1;
    }
   }
  }
  binary[low] = L[i];
  if (low > len)
  {
   len++;
  }
 }
 return len;
}
int main()
{
 int n;
 MAXLINE ml;
 while (scanf("%d", &n) != EOF)
 {
  ml.init(n);
 }
 return 0;
}

posted on 2009-07-23 16:01  ZAFU_VA  阅读(418)  评论(0)    收藏  举报

导航