题解 | #合唱队#

合唱队

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

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

int main(){
      /*
        最少出队 == 队伍里剩下的人数最多
        队伍要求,山峰状,即从左到顶峰是一个最长递增子序列,从右到顶峰是一个最长递增子序列
        将问题转换成求2次最长递增子序列
        dp1[i] 表示从左往右,以i为结尾的最长子序列长度
        dp2[i] 表示从右往左,以i为结尾的最长子序列长度
        dp1[i] + dp2[i] - 1 表示以i为峰值的队伍长度(峰值算了2次,因此要-1)
        最优解出现在 max(dp1[i] + dp2[i] - 1 )
      */
    int n;
    cin >> n;
    vector<int> heights(n);
    for(int i = 0 ; i < n ; i++)
        cin >> heights[i];
    vector<int> dp1(n,1);
    vector<int> dp2(n,1);
    int res = 0;

    //从左到右递增的最长序列
    for(int i = 1 ; i < n ; i++){
        for(int j = 0; j < i ; j++){
            if( heights[i] > heights[j] )
                dp1[i] = max(dp1[i],dp1[j]+1);
        }
    }

    // 从右到左递增的最长序列
    for(int i = n -2 ; i >= 0 ; i--){
        for(int j = n - 1 ;  j > i ; j--){
            if( heights[i] > heights[j] )
                dp2[i] = max(dp2[i],dp2[j] + 1);
        }
    }

    for(int i = 0 ; i < n ; i++)
        res = max(res, dp1[i]+dp2[i]-1);

    cout << n - res;
}
全部评论

相关推荐

2025-12-28 16:32
重庆邮电大学 Java
程序员花海:1.技能放最后,来面试默认你都会,技能没啥用 2.实习写的看起来没啥含金量,多读读部门文档,包装下 接LLM这个没含金量 也不要用重构这种 不会给实习生做的 3.抽奖这个还是Demo项目,实际在公司里面要考虑策略,满减,触发点,触发规则 库存 之类的,不是这个项目这么简单 4.教育背景提前,格式为 教育背景 实习 项目 技能 自我评价
简历被挂麻了,求建议
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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