您的位置:首页 > 大数据 > 人工智能

caioj1065:动态规划入门(一维一边推3:合唱队形)

2017-08-26 10:26 239 查看
【闲话】

清楚地记得以前写过...原来很久都没有听懂 听老师讲了好多遍才明白 不过还是忘记了(...)最长上升子序列可以说写的有点熟了但是下降老写错...多练吧唉 那可能还是没理解很好w 之前都没怎么注意缩进的问题 想怎么搞怎么搞...昨天翻书看if switch看到提示 想着还是注意一下括号的位置呀blabla的好了

【题目】
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,
他们的身高分别为T1,T2,…,TK,则他们的身高满足  T1 < T2  ...<  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<cstdio>
using namespace std;
int a[1005],b[1005],c[1005];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) b[i]=1;
for(int i=1;i<=n;i++)
{
for(int j=i-1;j>=b[i];j--)
{
if(a[j]<a[i])//
{
if(b[j]+1>b[i]) b[i]=b[j]+1;
}
}
}
for(int i=1;i<=n;i++) c[i]=1;
for(int i=n-1;i>=1;i--)//最后一个最长的是自己
{
for(int j=i+1;j<=n;j++)
{
if(a[i]>a[j])//一开始把>写成<了qwq
{
if(c[j]+1>c[i]) c[i]=c[j]+1;
}

}
}
int ans=0;
for(int i=1;i<=n;i++)
{
if(ans<b[i]+c[i]-1) ans=b[i]+c[i]-1; //自己计算了两次
}
printf("%d",n-ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划