安排车厢(线性模型DP)

安排车厢

            X中学的同学们要去春游了,他们春游的地点非常遥远,所以学校安排的交通工具是火车!现在所有的同学都已经在火车站进站口等待了,一共n名同学,他们排成了一行按照这个顺序登车。一节火车厢最多可以容纳m名同学,但是由于某种奇特的原因,一节车厢里只允许要么所有的同学都是同一种性别,要么男生和女生的人数差不能超过k,现在请问学校该怎样安排同学们才能使得用到的车厢尽量的少呢?

输入文件

            第一行三个数,分别表示n (n <= 1000),mk

            接下来n行描述排队的顺序,每行一个字母,表示是B(boy)或者是G(girl)

输出文件

            一个整数表示至少需要的车厢数。

样例输入

5 4 1
B
G
G
G
B

样例输出

2

状态转移方程:

    dp[j]+1   (j+1到i的学生可以组成一个车厢)

dp[i]=                        (0<=j<i)

    inf      (j+1到i的学生不能组成一个车厢)

代码:

#include <stdio.h>
#define MAXN 1010
#define inf 1000000000

int n,m,k;
int sumb[MAXN];
int sumg[MAXN];
char stu[MAXN];
int dp[MAXN];

int abs(int x)
{
	return x>=0? x:-x;
}

int pipei(int j,int i)
{
	int sumboy = sumb[i] - sumb[j];
	int sumgirl = sumg[i] - sumg[j];
	
	return (i-j <= m) && (sumboy==0 || sumgirl==0 || abs(sumboy-sumgirl)<=k);
}

int main()
{
	scanf("%d%d%d\n",&n,&m,&k);
	
	sumb[0]=0;
	sumg[0]=0;
	dp[0]=0;
	
	for(int i = 1; i <= n; i++)
	{
		scanf("%c\n",stu+i);
		if(stu[i] == 'B') {sumb[i]=sumb[i-1]+1; sumg[i]=sumg[i-1]; } 
		if(stu[i] == 'G') {sumg[i]=sumg[i-1]+1; sumb[i]=sumb[i-1]; }
		
		dp[i]=inf;
		for(int j = 0; j < i; j++)
		{
			if(pipei(j,i) && dp[j]+1 < dp[i])
			{
				dp[i] = dp[j]+1;
			}
		}
	}
	
	//for(int i=1; i<=n; i++)
	//{
	//	printf("%d %c %d\n",i,stu[i],dp[i]);
	//}
	
	printf("%d\n",dp[n]);
	
	return 0;
}


posted on 2011-07-15 03:51  Eucalyptus  阅读(493)  评论(0编辑  收藏  举报