题解 | #合唱队#

合唱队

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

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

int main(){
    int n;
    while(cin>>n){
        vector<int> list;
        int left[n],right[n];
        for(int i=0;i<n;i++){
            int num;cin>>num;
            list.push_back(num);
            left[i] = right[i] = 1;
        }
        
        int res[n];
        for(int i=0;i<list.size();i++){
            //计算左侧的LCS,当前面的
            // int max_ = 0;
            for(int j=0; j<i; j++){
                if(list[j] < list[i]){
                    left[i] = max(left[i],left[j]+1);
                }
            }
        
        }
        for(int i=list.size()-1;i>=0;i--){
            for(int j=i+1; j<list.size(); j++){
                if(list[j] < list[i] ){
                    right[i] = max(right[i],right[j]+1);
                    // min_ = list[j];
                }
            }   
        }
        for(int i=0;i<list.size();i++){
            // cout<<"left "<<left[i]<<" right: "<<right[i];
            res[i] = left[i]+right[i]-1;
        }
        int find_max = 0;
        for(int i=0;i<list.size();i++){
            if(res[i] >find_max )
                find_max = res[i];
        }

        cout<<n-find_max<<endl;;
    }
}
参考题解中左边进行LCS运算,动态规划只需要比较当前i下标的数,和循环j下标的数,右边换成下面这种也可以,就是说从左向右算LDS和从右向左算LDS结果是一样的,
for(int i=0;i<list.size();i++){
            for(int j=i+1;j<list.size();j++)
            {
                if(list[j]<list[i])
                    right2[i] = max(right2[i],right2[j]+1);
            }
        }






全部评论

相关推荐

头像
11-07 01:12
重庆大学 Java
精致的小松鼠人狠话不多:签哪了哥
点赞 评论 收藏
分享
头像
09-29 16:18
门头沟学院 Java
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务