题解 | #合唱队#
合唱队
https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4
#include <iostream> #include <vector> using namespace std; int main() { int n; cin >> n; vector<int> v(n); for (int i = 0; i < n; ++i) { cin >> v[i]; } vector<int> dp1(n, 1); // 从左到右的最长递增子序列长度 for (int i = 0; i < n; ++i) { for (int j = 0; j < i; ++j) { if (v[i] > v[j]) { dp1[i] = max(dp1[i], dp1[j] + 1); } } } vector<int> dp2(n, 1); // 从右到左的最长递增子序列长度 for (int i = n - 1; i >= 0; --i) { for (int j = n - 1; j > i; --j) { if (v[i] > v[j]) { dp2[i] = max(dp2[i], dp2[j] + 1); } } } int maxLength = 0; // 最长合唱队形的长度 for (int i = 0; i < n; ++i) { // 找到最长的合唱队形 maxLength = max(maxLength, dp1[i] + dp2[i] - 1); } cout << n - maxLength << endl; // 输出需要移除的人数 return 0; }
首先读取同学的总数n
和他们的身高,然后使用两个动态规划数组dp1
和dp2
来分别存储从左到右和从右到左的最长递增子序列长度。最后,通过比较dp1
和dp2
的值来找到最长的合唱队形,并输出需要移除的人数。