本文已参与「新人创作礼」活动,一起开启掘金创作之路。
思路:
从左到右求出1到i的最长上升子序列的长度,再求出1到n的最长下降子序列,最后枚举要求中的最大值。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int a[110];
int dp[110];
int dp2[110];
int dp3[110];
int main()
{
int n;
cin>>n;
for(int i = 1; i <= n; i++)
{
cin>>a[i];
dp[i] = dp2[i] = 1;
}
for(int i = 2; i <= n; i++)
{
for(int j = 1; j < i; j++)
{
if(a[j] < a[i])
{
dp[i] = max(dp[i], dp[j]+1);
}
}
}
for(int i = n-1; i >= 1; i--)
{
for(int j = i+1; j <= n; j++)
{
if(a[i] > a[j] && dp2[i] <= dp2[j]+1)
{
dp2[i]=dp2[j]+1;
}
}
}
int ans = 0;
for(int k = 1; k <= n; k++)
{
dp3[k] = dp[k]+dp2[k]-1;
ans = max(dp3[k],ans);
}
printf("%d\n",n-ans);
}