题解 | #合唱队#

合唱队

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

思路

合唱队问题可以转换为求列表中最长升序子序列和最长降序子序列问题。求出来之后,n - 最长生序列的长度+最长降序列长度 - 1 的最小值,即使本题的解。

代码

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    int n, i;
    while( cin >> n )
    {
        vector<int> nums(n);
        for(i = 0; i < n; i++)
            cin >> nums[i];
        vector<int> dp(n), dp_de(n);
        for(i = 0; i < n; i++)
        {
            dp[i] = 1;
            for(int j = 0; j < i; j++)
            {
                if(nums[j] < nums[i] && (dp[j] + 1) > dp[i])
                    dp[i] = dp[j] + 1;
            }
        }
        
        for( i = n - 1; i >= 0; i--)
        {
            dp_de[i] = 1;
            for( int j = n-1; j > i; j-- )
            {
                if( nums[j] < nums[i] && (dp_de[j] + 1) > dp_de[i])
                    dp_de[i] = dp_de[j] + 1;
            }
        }
        
        int minNum = n;
        for( i = 0; i < n; i++ )
        {
            minNum = min(minNum, n-(dp[i] + dp_de[i] - 1));
        }
        cout << minNum << endl;
    }
    return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-27 20:55
点赞 评论 收藏
分享
买蜜雪也用卷:我觉得应该没有哪个人敢说自己熟练使用git,代码分支一复杂还是得慢慢寻思一下的,不过基本的拉代码提交代码还有分支什么的是应该会
点赞 评论 收藏
分享
湫湫湫不会java:先投着吧,大概率找不到实习,没实习的时候再加个项目,然后把个人评价和荣誉奖项删了,赶紧成为八股战神吧,没实习没学历,秋招机会估计不多,把握机会。或者说秋招时间去冲实习,春招冲offer,但是压力会比较大
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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