您的位置:首页 > 其它

动态规划—29合唱队形

2017-04-20 18:57 197 查看
题目:让n个同学站成一列,然后让n-k个同学出列,剩下的同学组成的队列,他们的身高(T代表身高)要按照这个要求:T1 < T2 < … < Ti , Ti > Ti+1 > … > TK (1 <= i <= K)。

解题思路:用b,f两个数组分别存由i为分界点向左的最大下降子序列和向右的最大上升子序列,通过i循环将所有的i值都求出来,然后b[i]+f[i]最大的那个就是可以存在最多的人然后用n减去这个数再加1则是可以去除的最少人数。

细节处理:将这个题分解成两部分即是求最大下降子序列和最大上升子序列,然后再求解。

代码:#include<bits/stdc++.h>

using namespace std;

int a[200],b[200],f[200];

int main()

{
int i,j,n,max;
cin>>n;
memset(b,0,sizeof(b));
memset(f,0,sizeof(f));
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=n;i++)
{
b[i]=1;
for(j=1;j<=i-1;j++)
if((a[i]>a[j])&&(b[j]+1>b[i]))
b[i]=b[j]+1;
}
for(i=n;i>=1;i--)
{
f[i]=1;
for(j=i+1;j<=n;j++)
if((a[j]<a[i])&&(f[j]+1>f[i]))
f[i]=f[j]+1;
}
max=0;
for(i=1;i<=n;i++)
if(b[i]+f[i]>max)
max=b[i]+f[i];
cout<<n-max+1<<endl;
return 0;

}

感想:将问题转换一下求剔除的最少人即留下最多的人,求出留下的最多人数在用总人数相减加1即是剔除最少的人数,用这种方法解题更好解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: