经典动态规划之上升子序列问题
本题目变形了一下,需要计算两次上升子序列和下降子序列,保证子序列最长,这样出列人数就最少
附上代码
#include<stdio.h>

int main(void)
{
    int n;
    scanf("%d",&n);
    int high[3000]={0};
    for(int i=0;i<n;i++){scanf("%d",&high[i]);}
    int dp_up[3000];
    int dp_down[3000];
    for(int i=0;i<n;i++){dp_up[i]=1;dp_down[i]=1;}
    //计算上升子序列dp_up
    for(int i=1;i<n;i++)
    {
        for(int j=0;j<i;j++)
        {
            if(high[j]<high[i])
            {
                dp_up[i]=(dp_up[i]>dp_up[j]+1)?dp_up[i]:dp_up[j]+1;
            }
        }
    }
    //计算下降子序列dp_down
    for(int i=n-1;i>=0;i--)
    {
        for(int j=n-1;j>i;j--)
        {
            if(high[i]>high[j])
            {
                dp_down[i]=(dp_down[i]>dp_down[j]+1)?dp_down[i]:dp_down[j]+1;
            }
        }
    }
    //计算最少出列数量
    int num=0;
    for(int i=0;i<n;i++)
    {
        num=(num<dp_up[i]+dp_down[i]-1)?dp_up[i]+dp_down[i]-1:num;
    }
    printf("%d",n-num);
    return 0;
}