【题目描述】
N位同学站成一排,音乐老师要请其中的(N−K)位同学出列,使得剩下的KK位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,…,K,他们的身高分别为T1,T2,…,TK,则他们的身高满足T1<T2<…<Ti,Ti>Ti+1>…>TK(1≤i≤K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
【输入】
输入的第一行是一个整数N(2≤N≤100),表示同学的总数。第二行有n个整数,用空格分隔,第i个整数Ti(130≤Ti≤230)是第i位同学的身高(厘米)。
【输出】
输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
【输入样例】
8
186 186 150 200 160 130 197 220【输出样例】
4
#include<iostream>
using namespace std;
int cmp(int x,int y)
{
if(x>y) return x;
else return y;
}
int dp_rise[10000],dp_fall[10000];
int main()
{
int n,high[10000];
int rise_temp,fall_temp,temp;
int max=1;//留下人数
int i,j;
cin>>n;//人数
for(i=1;i<=n;i++)
{
cin>>high[i];
dp_rise[i]=1;
dp_fall[i]=1;
}
for(i=1;i<=n;i++)
{
rise_temp=0;
for(j=1;j<i;j++)
{
if(high[i]>high[j])
{
if(rise_temp<dp_rise[j])
rise_temp=dp_rise[j];
}
}
dp_rise[i]=rise_temp+1;
}
for(i=n;i>=1;i--)
{
fall_temp=0;
for(j=n;j>i;j--)
{
if(high[i]>high[j])
{
if(fall_temp<dp_fall[j])
fall_temp=dp_fall[j];
}
}
dp_fall[i]=fall_temp+1;
}
for(i=1;i<=n;i++)
{
temp=dp_rise[i]+dp_fall[i]-1;
max=cmp(max,temp);
}
cout<<n-max<<endl;
return 0;
}
信息学奥赛一本通T1264:动态规划的基本模型 合唱队形 归属于 动态规划的基本模型,更多同类题解源程序见:动态规划的基本模型 和 合唱队形
0 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!