合唱队(牛客网华为机试)

链接:https://www.nowcoder.com/questionTerminal/6d9d69e3898f45169a441632b325c7b4
来源:牛客网

算法:动态规划
用到概念:递增子序列
思想:

所有比m[i]小的数都可以作为倒数第二个数,在这些第二个数中,以哪个数结尾的递增子序列最大,就以那个数作为倒数第二个数 。以本身作为最后一个数,前面没有比它小的,则子序列为

合唱队(牛客网华为机试)_第1张图片

首先计算每个数在最大递增子串中的位置

186  186  150  200  160  130  197  200   quene

1      1      1      2       2      1      3     4       递增计数

然后计算每个数在反向最大递减子串中的位置--->计算反向后每个数在最大递增子串中的位置

200  197  130  160  200  150  186  186   反向quene

1      1      1       2     3      2      3       3      递减计数

然后将每个数的递增计数和递减计数相加

186  186  150  200  160  130  197  200   quene

1      1      1      2       2     1      3      4       递增计数

3      3      2      3       2     1      1      1       递减计数

4      4      3      5       4     2      4      5       每个数在所在队列的人数+1(自己在递增和递减中被重复计算)

如160这个数

在递增队列中有2个人数

150  160

在递减队列中有2个人数

160  130

那么160所在队列中就有3个人

150  160  130

每个数的所在队列人数表达就是这个意思

总人数 - 该数所在队列人数 = 需要出队的人数

  1. #include
    #include
    #include
    using namespace std;
    
    void callincsub(vector Queue,vector &Num)
    {
        for(int i=1;i=0;j--)
                if(Queue[i]>Queue[j] && Num[i]>n)
        {
            vector que;
            vector dp_1(n,1);
            vector dp_2(n,1);
            for(int i=0;i>m;
                que.push_back(m);
            }
            callincsub(que, dp_1);
            reverse(que.begin(),que.end());
            callincsub(que, dp_2);
            reverse(dp_2.begin(),dp_2.end());
            int max=0;
            for(int i=0;i max)
                    max=dp_1[i]+dp_2[i];
            }
            cout<

     

 

你可能感兴趣的:(算法,合唱队,C,华为机试)