输入:
8
186 186 150 200 160 130 197 220
输出:
4
题意: 有N个数 (2 <= N <= 100). 需要找一个序列T1<...<Ti>Ti+1>…>TK(1<=i<=K)。问最少需要去掉多少个数字。
思路: 最长上升子序列(LIS)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
//最长上升子序列
const int V = 100 + 50;
const int MaxN = 500 + 5;
const int mod = 1000000000 + 7;
//up[i] 表示前i个, 并且以num[i]结尾的最长上升子序列长度
//down[i] 表示后N - 1 - i, 并且以num[N - 1 - i]开始的最长下降子序列长度
int N, num[V], up[V], down[V], ans;
void f(int dp[]) {
vector<int> v;
for(int i = 0; i < N; ++i) {
int a = lower_bound(v.begin(), v.end(), num[i]) - v.begin();
if(a == v.size()) {
v.push_back(num[i]);
dp[i] = v.size();
}
else {
v[a] = num[i];
dp[i] = a + 1;
}
}
}
int main() {
int i, j;
scanf("%d", &N);
for(i = 0; i < N; ++i)
scanf("%d", &num[i]);
f(up);
int temp[V];
for(i = 0; i < N; ++i)
temp[i] = num[N - 1 - i];
for(i = 0; i < N; ++i)
num[i] = temp[i];
f(down);
for(i = 0; i < N; ++i)
ans = max(ans, up[i] + down[N - 1 - i] - 1);
printf("%d\n", N - ans);
}