题解 | #合唱队#
合唱队
https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4
#include <iostream> #include <queue> #include <vector> using namespace std; int main() { int N; cin >> N; // 注意 while 处理多个 case vector<int> height(N, 0); // 排除身高相等的人,记录剩下人数 int K = 0; // 排除的人数 int h; int n = 0; while (cin >> h) { if (n != 0 && h == height[n-1]) { N--; K++; } else { height[n] = h; n++; } } vector<int> dp_left(N, 0); vector<int> dp_right(N, 0); for (int i = 1; i <= N - 2; i++ ) { dp_left[i] = i; for (int j = i - 1; j >= 0; j--) { if (height[i] > height[j]) { if (dp_left[j] + (i - j) - 1 < dp_left[i]) { // 注意距离要减1 dp_left[i] = dp_left[j] + (i - j) - 1; } } } } for (int i = N - 2; i >= 1; i--) { dp_right[i] = N - 1 - i; for (int j = i + 1; j <= N - 1; j++) { if (height[i] > height[j]) { if (dp_right[j] + (j - i) - 1 < dp_right[i]) { // 注意距离要减1 dp_right[i] = dp_right[j] + (j - i) - 1; } } } } int res = dp_left[1] + dp_right[1]; for (int i = 1; i < N - 1; i++) { res = min(res, dp_left[i] + dp_right[i]); } cout << res + K << endl; return 0; } // 64 位输出请用 printf("%lld")