思路
正难则反。
求出保留的,即最长上升子序列,从头和从尾各求一遍,最后枚举出最大的保留的位数,
然后用 (n) 减去保留位数加 (1) 即可。
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 101;
int n ,a[MAXN] ,ans = 0;
int dp[MAXN] ,dp_[MAXN];
int main () {
scanf ("%d",&n);
for (int q = 1;q <= n;++ q) {
dp[q] = dp_[q] = 1;
scanf ("%d",&a[q]);
}
for (int q = 1;q <= n;++ q) {
for (int w = q - 1;w >= 1;-- w) {
if (w < dp[q]) break;
if (a[q] > a[w]) {
dp[q] = max (dp[q] ,dp[w] + 1);
}
}
}
for (int q = n;q >= 1;-- q) {
for (int w = q + 1;w <= n;++ w) {
if (n - w + 1 < dp_[q]) break;
if (a[q] > a[w]) {
dp_[q] = max (dp_[q] ,dp_[w] + 1);
}
}
}
for (int q = 1;q <= n;++ q)
ans = max (ans ,dp[q] + dp_[q]);
printf ("%d
",n - ans + 1);
return 0;
}