题目链接:http://poj.org/problem?id=1836
大意:
一组士兵,按1~n序号排列,要求最后队伍成三角形形状排列,问最少出去几个人可以达到要求
思路:
从左至右,从右至左, 做最长上升子序列, 枚举每个中间点的位置,要考虑两人身高相同的情况
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long double h[1010];
int f[1010];
int g[1010];
int main()
{
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
cin>>h[i];
f[i] = 1;
g[i] = 1;
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j < i; j++)
{
if(h[j] < h[i])
{
f[i] = max(f[i], f[j] + 1);
}
}
}
for(int i = n; i >= 1; i--)
{
for(int j = n; j > i; j--)
{
if(h[j] < h[i])
{
g[i] = max(g[i], g[j] + 1);
}
}
}
int ans = 9999;
for(int i = 1; i <= n; i++)
{
ans = min(ans, n - f[i] - g[i] + 1);
for(int j = i + 1; j <= n; j++)
{
if(h[j] == h[i])
ans=min(ans, n - f[i] - g[j]);
}
}
printf("%d\n", ans);
return 0;
}