main
黄海 1 year ago
parent de51474a58
commit a665b51416

@ -1,12 +1,69 @@
#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 110;
double a[N];
int n;
int f1[N], f2[N];
int main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
// 以每棵树为保留的并且是最高的那棵树分别求出最长上升序列长度x 和 最长下降序列长度y x+y-1就是最终保留的整体序列长度
// 去掉的数量就是 n-(x+y-1)的值。然后求min()
// 需要注意的是默认值设置为-1比如 5 4 3 2 1 ,我们取哪棵为最高点都行不通,不存在左侧上侧到峰值的情况,右侧即使符合也不行的。
// 求最长上升
for (int i = 1; i <= n; i++) {
f1[i] = 1;
for (int j = 1; j < i; j++)
if (a[i] > a[j]) f1[i] = max(f1[i], f1[j] + 1);
}
// 求最长下降
for (int i = n; i >= 1; i--) {
f2[i] = 1;
for (int j = n; j > i; j--)
if (a[i] > a[j]) f2[i] = max(f2[i], f2[j] + 1);
}
// // 输出最长上升
// for (int i = 1; i <= n; i++) cout << f1[i] << " ";
// cout << endl;
// // 输出最长下降
// for (int i = 1; i <= n; i++) cout << f2[i] << " ";
// cout << endl;
bool flag = true;
for (int i = 1; i <= n; i++)
if (f1[i] != 1) {
flag = false;
break;
}
if (flag) {
cout << -1 << endl;
exit(0);
}
flag = true;
for (int i = 1; i <= n; i++)
if (f2[i] != 1) {
flag = false;
break;
}
if (flag) {
cout << -1 << endl;
exit(0);
}
int mi = -1;
for (int i = 1; i <= n; i++) {
int tmp = f1[i] + f2[i];
mi = max(mi, tmp);
}
cout << n - mi + 1 << endl;
return 0;
}

@ -0,0 +1,2 @@
10
1.0 2.3 1.2 1.7 1.1 2.0 1.8 1.8 1.2 1.9
Loading…
Cancel
Save