HJ24 合唱队 CPP版本

75 阅读1分钟

描述

image.png

解析

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> vec(n,0);
    for (int i = 0; i < n; ++i) {
        cin >> vec[i];
    }
    vector<int> up(n,1);
    vector<int> down(n,1);
    // 最长上升子序列
    for (int i = 1; i < n; ++i) {
        for (int j = 0; j < i; ++j) {
            if (vec[j] < vec[i]) {
                up[i] = max(up[i],up[j]+1);
            }
        }
    }
    // 最长下降子序列
    for (int i = n-2; i >= 0; --i) {
        for (int j = n-1; j > i; --j) {
            if (vec[i] > vec[j]) {
                down[i] = max(down[i],down[j]+1);
            }
        }
    }
    int ans = 0;
    for (int i = 0; i < n; ++i) {
        ans = max(ans,down[i]+up[i]-1);
    }
    // 排除n-ans个
    cout << n - ans ;
    return 0;
}

思路:分别求出最长上升子序列up[i]和最长下降子序列down[i]down[i]+up[i]-1是位置i满足条件的合唱队长度,找到max,n-max即为最少的出列同学数目。