经典动态规划之上升子序列问题
本题目变形了一下,需要计算两次上升子序列和下降子序列,保证子序列最长,这样出列人数就最少
附上代码
#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;
}

京公网安备 11010502036488号