题解 | #合唱队#

合唱队

https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4

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

class Solution{
public:
    int min_exclude(vector<int> &data, int N){
        vector<int> dpl(N+1, 0); 
        vector<int> dpr(N+1, 0);
        // 左边最大增序列长度
        for (int i = 1; i <= N; i++){
            // 左边所有小于当前i身高的最大增序列长度当中的最大值+1
            for (int j = 1; j < i; j++){
                if (data[i] > data[j]) dpl[i] = max(dpl[i], dpl[j]);
            }
            dpl[i] ++; // i=1则为1
        }

        // 右边最大减序列长度
        for (int i = N; i >= 1; i--){
            for (int j = N; j > i; j--){
                if (data[i] > data[j]) dpr[i] = max(dpr[i], dpr[j]);
            }
            dpr[i] ++;
        }

        // 找最大值
         int max_len = 0;
         for (int i = 1; i <= N; i++) max_len = max(max_len, dpl[i]+dpr[i]-1); //包括了自己,所以要减掉重复的一次


        return N - max_len;
    }
};

int main() {
    int N;
    cin >> N;

    vector<int> data(N+1, 0);
    for (int i = 1; i <= N; i++){
        cin >> data[i];
    }

    Solution res;
    cout << res.min_exclude(data, N) << endl;
    return 0;
}

主要是太难想到这一层,依托于最大序列

全部评论

相关推荐

真烦好烦真烦:牛友太有实力了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务