思路很好想 从前从后两遍最长上升子序列
而且要用n方的算法 nlogn不易记录当前位值
数据不严谨 题目要求是先递增后递减序列
结果数据给了全递增数列 也算合法 真的是醉醉的
//#pragma GCC optimize(2)
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <string>
#include <cstring>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <ctime>
#include <vector>
#include <fstream>
#include <list>
#include <iomanip>
#include <numeric>
using namespace std;
typedef long long ll;
const int MAXN = 1e6 + 10;
int arr[MAXN] = {0}, n, ans = 1;
int head[MAXN], tail[MAXN];
void Lis()
{
for(int i = 0; i < n; i++)
for(int j = 0; j < i; j++)
if(arr[j] < arr[i])
head[i] = max(head[i], head[j] + 1);
}
void Lisi()
{
for(int i = n - 1; i >= 0; i--)
for(int j = n - 1; j > i; j--)
if(arr[j] < arr[i])
tail[i] = max(tail[i], tail[j] + 1);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin>>n;
for(int i = 0; i < n; i++)
cin>>arr[i], head[i] = 1, tail[i] = 1;
Lis();
Lisi();
// for(int i = 0; i < n; i++)
// {
// cout<<head[i]<<' ';
// }
//
// cout<<endl;
//
// for(int i = 0; i < n; i++)
// {
// cout<<tail[i]<<' ';
// }
for(int i = 0; i < n; i++)
{
ans = max(ans, (head[i] + tail[i]) - 1);
}
cout<<n - ans<<endl;
return 0;
}