题目
分析
这题是一道动态规划题目,根据题目要求,作者道题目思路是这样的:先求第 i 个同学左边最长上升序列长度,再求第 i 个人右边最长下降序列的长度,时间复杂度为O(n^2)。
AC代码
#include <iostream>
#include <cstdio>
using namespace std;
int a[105], Left[105], Right[105];
int main()
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
}
// 初始化
for (int i = 1; i <= n; i++)
{
Left[i] = 1;
Right[i] = 1;
}
// i左边最长上升序列长度
for (int i = 2; i <= n; i++)
{
for (int j = 1; j < i; j++)
{
if (a[i] > a[j])
{
Left[i] = max(Left[i], Left[j] + 1);
}
}
}
// i右边最长下降序列长度
for (int i = n - 1; i >= 0; i--)
{
for (int j = n; j > i; j--)
{
if (a[i] > a[j])
{
Right[i] = max(Right[i], Right[j] + 1);
}
}
}
int ans = -1;
for (int i = 1; i <= n; i++)
{
ans = max(ans, Left[i] + Right[i] - 1);// i 自己本身加了两次,所以减一
}
printf("%d\n", n - ans);
return 0;
}