题解 | #合唱队#

合唱队

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

//两次递归,从左到右递归每一个节点的左侧最大值
//从右到左递归每一个节点的右侧最大值

#include <iostream>
#include<vector>

using namespace std;

int main() {
    int n;    
    while (cin >> n) { // 注意 while 处理多个 case
        int rdp[3001];//存储每个节点的左侧dp,这里r和l写反了,只能将错就错了
        int ldp[3001];//存储每个节点的右侧dp
        int a[3001];//储存身高信息
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            rdp[i]=1;//初始化自身在队情况
            ldp[i]=1;
            for(int j=1;j<i;j++)//rdp,左侧递归求解每个节点作为中间节点时的左侧最大值
            {
                if((a[j]<a[i])&&(rdp[j]+1)>rdp[i])
                {
                    rdp[i]=rdp[j]+1;
                }
            }
        }
        for(int i=n;i>=1;i--)//ldp,类似上
        {
            for(int j=n;j>i;j--)
            {
                if((a[j]<a[i])&&(ldp[j]+1)>ldp[i])
                {
                    ldp[i]=ldp[j]+1;
                }
            }
        }
        int max=0;
	  //最终结果max为每个节点的左侧最大值(含自己作为中间)+右侧最大值(含自己作为中间)
	  //因为包含两次自己,所以最后结果max=max-1;
	  //答案输出n-max
        for(int i=1;i<=n;i++)
        {
            if(ldp[i]+rdp[i]-1>max)
            {
                max=ldp[i]+rdp[i]-1;
            }
        }

        cout<<n-max<<endl;
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

10-15 15:00
潍坊学院 golang
跨考小白:这又不是官方
投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
躺尸修仙中:因为很多92的也去卷中小厂,反正投递简历不要钱,面试不要钱,时间冲突就推,不冲突就面试积累经验
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务