a[i] 身高的数组,b是 从左向右身高递增的人数序列,其中b[i]为同学1到i间 (包括同学i)
身高满足递增顺序的最多人数。同理 c就是从右向左的
max{b[i]+c[i]}-1;因为第i个同学被计算两次所以减一
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
int a[200], b[200], c[200];
int n, i, j, maxx;
cin >> n;
memset(b, 0, sizeof(b)); memset(c, 0, sizeof(c));
for (i = 1; i <= n; i++)
cin >> a[i];//同学的身高
for (i = 1; i <= n; i++)//按照从左向右的顺序计算
{
b[i] = 1;
for (j = 1; j <= i - 1; j++)
if (a[i] > a[j] && b[j] + 1 > b[i])
b[i] = b[j] + 1;
}
for (i = n; i >=1; i--) //按照从右向左的顺序计算
{
c[i] = 1;
for (j = i+1; j <=n; j++)
if (a[i] > a[j] && c[j] + 1 >c[i])
c[i] = c[j] + 1;
}
maxx = 0;//计算合唱队的人数max其中一个人被重复计算!
for (i = 1; i <= n; i++)
if (b[i] + c[i] > maxx)
maxx = b[i] + c[i];
cout << n - maxx + 1 << endl;
}