请教一个关于动态规划算法的问题!!谢谢啦!!!!
题目:
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1 < T2 < ...< Ti > Ti+1 > … >TK(1<=i<=K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
请各位高手给去具体算法,小女子感激不尽啦!!谢谢!!
[解决办法]
acmer? 最讨厌动态规划,脑子笨,总想不出来子状态,不过这个题偶还是会的,呵呵,代码送给你
#include <stdio.h>
#define len 40000
int main()
{
int m,n,i,j,mid,up,down,max;
int a[len],d[len];
while(scanf("%d",&n)==1) //输入一共有几位同学
{
for(i=0;i<n;i++)
scanf("%d",&a[i]); //用a数组记录这n位同学的身高
d[0]=-1;
d[1]=a[0];
max=1;
for(i=1;i<n;i++) //查找每个同学是否在最长子序列里
{
down=0;
up=max;
while(down<=up) //用d数组记录最x长子序列的最小身高是多少
{
mid=(up+down)/2;
if(d[mid]<a[i]) down=mid+1;
else up=mid-1;
}
d[down]=a[i];
if(down>max) max++; //这里采用二分法查找d数组,满足nlogn
}
printf("%d\n",n-max); //打印最少出列的同学数
}
return 0;
}