- 合唱队形
- 2014-12-01 11:01:43 @
为何这样不对呢??实在疑惑。。
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
#define MAXN 110
int dp[MAXN], h[MAXN];
int lmax, rmax;
int LIS(int l, int r, int flag)
{
int len = 1;
if(flag > 0)
{
dp[1] = l;
for(int i = l + 1; i <= r; i++)
{
if(h[i] < h[dp[1]])
dp[1] = i;
else if(h[i] > h[dp[len]])
dp[++len] = i;
else
{
for(int j = len; j >= 1; j--)
if(h[i] < h[dp[j]])
dp[j - 1] = i;
}
}
lmax = dp[len];
}
else
{
dp[1] = r;
for(int i = r - 1; i >= l; i--)
{
if(h[i] < h[dp[1]])
dp[1] = i;
else if(h[i] > h[dp[len]])
dp[++len] = i;
else
{
for(int j = len; j >= 1; j--)
if(h[i] < h[dp[j]])
dp[j - 1] = i;
}
}
rmax = dp[len];
}
return len;
}
bool check(int l, int r)
{
for(int i = l; i <= r; i++)
if(h[i] > h[l])
return false;
return true;
}
int main()
{
// freopen("1098.in", "r", stdin);
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", h + i);
int ans = n - 1;
for(int i = 1; i < n - 2; i++)
{
int tmp = LIS(0, i, 1) + LIS(i + 1, n - 1, -1);
if(h[lmax] == h[rmax] && check(lmax, rmax))
tmp--;
ans = min(ans, n - tmp);
}
printf("%d\n", ans);
return 0;
}