题解 | #合唱队#

合唱队

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

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

int main() {
    int n,maxlen=0;
    cin>>n;
    vector<int> v(n),dp1(n,1),dp2(n,1);
    for(int i=0;i<n;++i)cin>>v[i];
    for(int i=1;i<n;++i){
        for(int j=0;j<i;++j){// 记录左侧
            if(v[j]<v[i]){
                dp1[i]=max(dp1[i],dp1[j]+1);
            }
        }
    }
    for(int i=n-2;i>=0;--i){
        dp2[i]=1;
        for(int j=n-1;j>i;--j){// 记录右侧
            if(v[j]<v[i]){
                dp2[i]=max(dp2[i],dp2[j]+1);
            }
        }
    }
    for(int i=0;i<n;i++){
        if(dp1[i]+dp2[i]-1>maxlen)maxlen=dp1[i]+dp2[i]-1;
    }
    cout<<n-maxlen<<endl;
}

思路:

将问题抽象为:寻找队列中”最大“的中间数,每一个数可以看作一个单个"合唱队"。对每一个数对应两个参数:左边递减的数、右边递减的数。在依次遍历完成后,寻找左右参数之和最大的数(根据自己实际代码要注意是否需要减1),即为合唱队最多人数。

算法:动态规划(时间复杂度O(n^{2})

以我个人看来,这道题无疑是动态规划的入门最佳题。从问题拆分到历史数据记录都能有所体现,而且在历史数据记录的问题上可以从for循环的方向选择中有所体现。换个说法就是从0向n-1遍历(++i)和从n-1向0遍历(--i)是不同的记录过程。具体的就多做两道题或者看看这道题解(思路很像的)合并表记录

春节怠慢了,后续会继续努力寻找有意思的题目分享

全部评论

相关推荐

最近经历我的处女面,还是一家大厂,笑自己不自量力,面试官态度特好,问的问题也很专业。好多问题结结巴巴说不出来,还以为自己多厉害呢。跑过去耽误人家时间……😅简历上的写的最好还是实打实,不然一问三不知。
不要卷我了:我的第一次面大厂,前面聊的好好的,直到说让我写道sql,题很简单,但是我完全没准备光刷算法题了,group by后面多写了个字段,我说我写好了面试官笑了一下,后面说要去面下一个同学了
26届校招投递进展
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-01 17:00
点赞 评论 收藏
分享
07-01 23:23
郑州大学 Java
否极泰来来来来:牛客迟早有高三的
点赞 评论 收藏
分享
07-03 16:02
门头沟学院 Java
今天面试,非常紧张,面试官问我springboot有哪些核心模块都答不上来了,真的对自己无语了!
程序员小白条:28届我勒个去,很多人面试都没机会
查看1道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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