题解 | #合唱队形#

合唱队形

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;
}

全部评论

相关推荐

07-03 16:02
门头沟学院 Java
今天面试,非常紧张,面试官问我springboot有哪些核心模块都答不上来了,真的对自己无语了!
程序员小白条:28届我勒个去,很多人面试都没机会
查看1道真题和解析
点赞 评论 收藏
分享
Java抽象带篮子:简历怎么写可以看看我发的帖子,你的第一个是实习经历吗?那怎么写的是你的第一个练手项目呢?简历写的怎么样直接投小厂面试一下就知道了
没有实习经历,还有机会进...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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