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