最长子序列问题

合唱队

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

先找到每一个位置i左侧的最长上升子序列长度numL[i]:每一个位置左侧最长子序列长度等于其左侧比它小的所有位置的最长子序列长度中的最大值+1
再找到每一个位置i右侧的最长下降子序列长度numR[i]:每一个位置右侧最长子序列长度等于其右侧比它小的所有位置的最长子序列长度中的最大值+1
然后求出所有位置的最长序列长度=左侧最长子序列长度+右侧最长子序列长度-1(因为该位置被算了两次,所以减1)
然后用数目减去最长序列长度就是答案

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int len;
    while(cin>>len)
    {
    vector<int> hight(len);
    vector<int> numL(len);
    vector<int> numR(len);
    for(int &a:hight)
        cin>>a;

    for(int i=0;i<len;i++)
    {
        for(int j=0;j<i;j++)
        {
            if(hight[i]>hight[j])
            {
                numL[i]=max(numL[i],numL[j]);   
            }

        }
       numL[i]=numL[i]+1;      
    }

    for(int i=len-1;i>=0;i--)
    {
        for(int j=len-1;j>i;j--)
        {
            if(hight[i]>hight[j])
            {
                numR[i]=max(numR[i],numR[j]); 
            }

        }
       numR[i]=numR[i]+1;

    }
    int max=0;
    for(int i=0;i<len;i++)
    {

        if(max<numL[i]+numR[i]-1)
            max=numL[i]+numR[i]-1;
    }

    cout<<len-max<<endl;  
    }
}
全部评论
秒啊。单个升序子序列会做,复数个顺序子序列没看出来。
点赞 回复 分享
发布于 2021-12-31 20:09
妙哉,问题是数据太多后会超时呀
点赞 回复 分享
发布于 2022-11-16 00:47 浙江

相关推荐

听说改名字就能收到offer哈:Radis写错了兄弟
点赞 评论 收藏
分享
评论
148
10
分享
牛客网
牛客企业服务