题解 | #合唱队#

合唱队

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

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

int main() {
    int N;
    cin >> N;
    vector<int> tall(N);
    for(int i=0;i<N;++i){
        cin >> tall[i];
    }
    vector<vector<int>> dp(N,vector<int>(2,1));
    for(int i=0;i<N;++i){
        for(int j=0;j<i;++j){
            if(tall[i]>tall[j])
                dp[i][0]=max(dp[i][0],dp[j][0]+1);
        }
    }
    for(int i=N-1;i>=0;--i){
        for(int j=N-1;j>i;--j){
            if(tall[i]>tall[j])
                dp[i][1]=max(dp[i][1],dp[j][1]+1);
        }
    }
    int m=N;
    for(int i=0;i<N;++i){
        if(N+1-dp[i][0]-dp[i][1]<m)
            m=N+1-dp[i][0]-dp[i][1];
    }
    cout << m;
}
// 64 位输出请用 printf("%lld")

实际上是两个最长递增序列。

一个最长递增序列从左向右;一个从右向左。

维持两个dp数组,dp[i][0]和dp[i][1]分别保存在两个序列中以i为结尾的最长递增序列的长度。

需要出列的学生为N+1-dp[i][0]-dp[i][1]

全部评论

相关推荐

07-10 11:08
门头沟学院 Java
Sairus:我注册都注册不了提醒我手机号二次啥的,果然对于人才推得就是快,像我投完了就没回音的
投递京东等公司10个岗位
点赞 评论 收藏
分享
半解316:内容充实,细节需要修改一下。 1,整体压缩为一页。所有内容顶格。 2,项目描述删除,直接写个人工作量 修改完之后还需要建议,可以私聊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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