题解 | 合唱队形

#include <bits/stdc++.h>
using namespace std;

const int SIZE=100000;

int dp[SIZE];
int dp2[SIZE];

int main(){
    int n;
    while(cin>>n){
        memset(dp,INT_MIN,sizeof(dp));
        int a[n];
        for(int i=0;i<n;i++){
            cin>>a[i];
        }
        for(int i=0;i<n;i++){
            dp[i]=1;
            for(int j=0;j<i;j++){
                if(a[j]<a[i])dp[i]=max(dp[i],dp[j]+1);
            }
        }
        for(int i=n-1;i>=0;i--){
            dp2[i]=1;
            for(int j=n-1;j>i;j--){
                if(a[j]<a[i])dp2[i]=max(dp2[i],dp2[j]+1);
            }
        }

        int ans=1;
        for(int i=0;i<n;i++){
            if(dp[i]+dp2[i]>ans)ans=dp[i]+dp2[i];
        }
        cout<<n-ans+1<<endl;
    }
}

本题要找到两个方向上的最长段,可以知道,他要一个尖角,那么其实并不困难,只需要找到在 i 点往前和往后的最优删除即可,就利用我们的最优长度的计算方法,去找到两个最值,根据数学分析,可以知道n+1-两个的和,就是我们要的结果

全部评论
主要理解一个dp[i]的涵义及其应用,前面都是最大值,找一个最值是为了单项的最优,其实对于每个dp[i],都是当前的最优,不过注意是向左还是向右,因为这里生成了两个dp[]
点赞 回复 分享
发布于 2025-01-10 16:42 河南

相关推荐

评论
点赞
1
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
4491次浏览 39人参与
# 你的实习产出是真实的还是包装的? #
1041次浏览 27人参与
# MiniMax求职进展汇总 #
22780次浏览 292人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
6867次浏览 36人参与
# 简历第一个项目做什么 #
31234次浏览 312人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186322次浏览 1114人参与
# 巨人网络春招 #
11132次浏览 221人参与
# 面试紧张时你会有什么表现? #
30313次浏览 188人参与
# 简历中的项目经历要怎么写? #
309332次浏览 4147人参与
# 网易游戏笔试 #
6301次浏览 83人参与
# 职能管理面试记录 #
10676次浏览 59人参与
# 把自己当AI,现在最消耗你token的问题是什么? #
6825次浏览 154人参与
# 从哪些方向判断这个offer值不值得去? #
56693次浏览 357人参与
# 腾讯音乐求职进展汇总 #
160385次浏览 1105人参与
# 小红书求职进展汇总 #
226831次浏览 1356人参与
# AI时代,哪些岗位最容易被淘汰 #
62295次浏览 723人参与
# 你怎么看待AI面试 #
179221次浏览 1160人参与
# 正在春招的你,也参与了去年秋招吗? #
362456次浏览 2631人参与
# 你的房租占工资的比例是多少? #
92120次浏览 896人参与
# 机械求职避坑tips #
94393次浏览 567人参与
# 校招笔试 #
465886次浏览 2948人参与
# 面试官最爱问的 AI 问题是...... #
27052次浏览 834人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务