题解 | #合唱队#

合唱队

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

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

int main(){
      /*
        最少出队 == 队伍里剩下的人数最多
        队伍要求,山峰状,即从左到顶峰是一个最长递增子序列,从右到顶峰是一个最长递增子序列
        将问题转换成求2次最长递增子序列
        dp1[i] 表示从左往右,以i为结尾的最长子序列长度
        dp2[i] 表示从右往左,以i为结尾的最长子序列长度
        dp1[i] + dp2[i] - 1 表示以i为峰值的队伍长度(峰值算了2次,因此要-1)
        最优解出现在 max(dp1[i] + dp2[i] - 1 )
      */
    int n;
    cin >> n;
    vector<int> heights(n);
    for(int i = 0 ; i < n ; i++)
        cin >> heights[i];
    vector<int> dp1(n,1);
    vector<int> dp2(n,1);
    int res = 0;

    //从左到右递增的最长序列
    for(int i = 1 ; i < n ; i++){
        for(int j = 0; j < i ; j++){
            if( heights[i] > heights[j] )
                dp1[i] = max(dp1[i],dp1[j]+1);
        }
    }

    // 从右到左递增的最长序列
    for(int i = n -2 ; i >= 0 ; i--){
        for(int j = n - 1 ;  j > i ; j--){
            if( heights[i] > heights[j] )
                dp2[i] = max(dp2[i],dp2[j] + 1);
        }
    }

    for(int i = 0 ; i < n ; i++)
        res = max(res, dp1[i]+dp2[i]-1);

    cout << n - res;
}
全部评论

相关推荐

点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务