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;
}
浙公网安备 33010602011771号