题解 | #合唱队#
合唱队
https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
while (cin >> n) {
vector<int> h(n,0), L(n,0), R(n,0);
int ans = n;
for (int i = 0; i < n; i++)
cin >> h[i];
// L[i]表示在i位置,左边最多有多少人严格递减
for (int i = 1; i < n; i++) {
int t = 0;
for (int j = i-1; j >= 0; j--) {
if (h[i] > h[j]) {
t = max(t, L[j] + 1);
}
}
L[i] = t;
}
// R[i]表示在i位置,右边最多有多少人严格递减
for (int i = n-2; i >= 0; i--) {
int t = 0;
for (int j = i+1; j<n; j++) {
if (h[i] > h[j]) {
t = max(t, R[j]+1);
}
}
R[i] = t;
}
// 计算每一个位置,若左右至少有一个人严格递减,那么记录并取最大值
for (int i = 0; i < n; i++) {
if (L[i] != 0 && R[i] != 0)
ans = min(ans, n-(L[i]+R[i]+1));
}
cout << ans << endl;
}
}
// 64 位输出请用 printf("%lld")
平时写代码少,认为动态规划的思路:
① 找一个暴力可求解的方法
② 对暴力方法进行动态规划优化
查看15道真题和解析