因为(1 <= i <= k)
所以该队形可以是这三种情况。
我们可以定一个人为最高点的那个人,然后求得左边的最多人数(x)(呈上升趋势)(包含最高点),再求右边的最多人数(y)(呈下降趋势)(包含最高点),然后我们要求的即为 x + y - 1
所以我们就将题目变相改成求左边的最长上升子序列,右边的最长下降子序列(可以变换为从右向左看求最长上升子序列)
问题就转化为求最长上升子序列了:
即dp问题:
#include <iostream>
using namespace std;
const int N = 1010;
int n;
int f[N], g[N], a[N];
int main() {
cin >> n;
for(int i = 1; i <= n; ++i)
cin >> a[i];
for(int i = 1; i <= n; ++i)
{
f[i] = 1;
for(int j = 1; j < i; ++j)
{
if(a[i] > a[j])
f[i] = max(f[j] + 1, f[i]);
}
}
for(int i = n; i >= 1; --i)
{
g[i] = 1;
for(int j = n; j > i; --j)
{
if(a[i] > a[j])
g[i] = max(g[j] + 1, g[i]);
}
}
int ret = 0;
for(int i = 1; i <= n; ++i)
ret = max(f[i] + g[i] - 1, ret);
cout << n - ret << endl;
return 0;
}