题解 | 合唱队形

#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[]
点赞 回复 分享
发布于 01-10 16:42 河南

相关推荐

昨天 11:58
门头沟学院 Java
腾讯暑期实习java选手,完全不懂C++,貌似游戏行业都是用C++的而且天美好像在成都,个人比较想去上海或深圳
siestaaaaaa:天美不止在成都,深圳上海都有。 游戏服务器也不全是cpp,至少我们项目是java ,但是工作中什么语言都会用到,比如cpp、lua、py等等,语言本身其实不重要
点赞 评论 收藏
分享
02-25 11:29
产品经理
牛客444597598号:兄弟 我只能说如果想找产品经理这种简历 基本就是毕业失业了 你这连实习都找不到的 简历跟产品经理一点都没有关系,你可以去搜搜产品的模版吧
点赞 评论 收藏
分享
03-07 13:49
门头沟学院 Java
逆流河上万仙退:可能是发的钱太少了 怕你过来实习还要自己贴钱 意向就不高 省的浪费大家时间 可能你通过了也不会去
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务