题解 | #合唱队形#

合唱队形

https://www.nowcoder.com/practice/0045cd3e39634a66ada63c2adeb49234

从右往左 求最大递增子序列 从左往右求最大递增子序列

合并在一起 去除中间同学 得到山丘型的序列答案

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

const int N = 1010;
int a[N], f[N], g[N];

int main(){
    int n;
    cin >> n;
    for(int i = 0; i < n; i ++) cin >> a[i];
    for(int i = 0; i < n; i ++){
        f[i] = 1;
        for(int j = 0; j < i; j ++){
            // 递增
            if(a[i] > a[j]) f[i] = max(f[i], f[j] + 1);
        }
    }

    // 从右往左求最大上升子序列 也就是最大递减序列的长度
    for(int i = n - 1; i >= 0; i --){
        g[i] = 1;
        for(int j = n - 1; j > i; j --){
            if(a[i] > a[j]) g[i] = max(g[i], g[j] + 1);
        }
    }

    int res = 0;
    // f[i]是以i为终点的最大上升子序列 g[i]是以i为起点的递减子序列
    for(int i = 0; i < n; i ++) res = max(res, f[i] + g[i] - 1);

    res = n - res;
    cout << res;
}

全部评论

相关推荐

totoroyyw:千年老妖😂
投递华为等公司10个岗位
点赞 评论 收藏
分享
有趣的牛油果开挂了:最近这个阶段收到些杂七杂八的短信是真的烦
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务