题解 | #合唱队#

合唱队

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

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

int main() {
    int N;
    cin >> N;
    vector<int> res;
    for (int i  = 0; i < N; i++) {
        int n;
        cin >> n;
        res.push_back(n);
    }

    // for (vector<int>::iterator it = res.begin(); it != res.end(); ) { //去重
    //     if (count(res.begin(), res.end(), *it) != 1) {
    //         it = res.erase(it);
    //     } else {
    //         it++;
    //     }
    // }
    // vector<int> dp_up(res.size(), 1), dp_down(res.size(), 1);
    // for(int i = 1, j = res.size()-2; i < res.size(); i++, j--)
    // {
    //     for(int k = 0; k < i; k++)
    //     {
    //         if(res[i] > res[k])
    //         {
    //             if(dp_up[k] + 1 > dp_up[i])
    //             dp_up[i] = dp_up[k]+1;
    //         }
    //     }
    //     for(int k = res.size()-1; k > j; k--)
    //     {
    //         if(res[j] > res[k])
    //         {
    //             if(dp_down[k] + 1 > dp_down[i])
    //             dp_down[j] = dp_down[k]+1;
    //         }
    //     }
    // }
    // vector<int> dp(res.size(), 0);
    // for(int i = 0; i < dp.size(); i++)
    // {
    //     dp[i] = dp_up[i] + dp_down[i] - 1;
    // }
    // int ans = N-dp[0];
    // for(int i : dp)
    // {
    //     if(N-i < ans)
    //     ans = N-i;
    // }
    // 设置两个dp数组
    int i, j, n = N;
    vector<int>heights(res );
    vector<int> dp_h(n, 1), dp_t(n, 1);
    // 正序遍历
    for (i = 0; i < n; i++) {
        for (j = 0; j < i; j++) {
            if (heights[i] > heights[j]) {
                dp_h[i] = max(dp_h[i], dp_h[j] + 1);
            }
        }
    }
    // 逆序遍历
    for (i = n - 1; i >= 0; i--) {
        for (j = n - 1; j > i; j--) {
            if (heights[i] > heights[j]) {
                dp_t[i] = max(dp_t[i], dp_t[j] + 1);
            }
        }
    }
    // 求和得到最长先增后减子序列的长度
    int maxNum = 0;
    for (i = 0; i < n; i++) {
        if (dp_t[i] + dp_h[i] - 1 > maxNum)
            maxNum = dp_t[i] + dp_h[i] - 1;
    }
    // 输出
    cout << n - maxNum << endl;
    // cout << ans;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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