bzoj 3367: [Usaco2004 Feb]The Big Game 球赛(DP)

为避免球迷冲突,需合理安排车辆运送不同球队的球迷奶牛。此问题通过动态规划算法解决,确保每辆车中两队球迷数量接近,以最小化所需车辆总数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3367: [Usaco2004 Feb]The Big Game 球赛

Time Limit: 10 Sec   Memory Limit: 128 MB
Submit: 56   Solved: 45
[ Submit][ Status][ Discuss]

Description

    快到奶牛冠军杯足球赛了,今年在J队与H队之间将会出现十分激烈的对抗.
    作为今年牛奶生产创记录的奖励,约翰同意他的奶牛们观看这场比赛.N(1≤N≤2500)头
牛已经在仓房排好队.他们将被挨个儿地接上车,直到约翰喊停.之后下一辆车继续挨个儿接奶牛.最终,奶牛将都被送上车.一些牛是J队的球迷,另一些是H队的球迷,竞争对手之间往往相处得很糟.所以,约翰不能让一辆汽车上载过多的J队球迷或H队球迷,这样另一支队的球迷在途中会受到恐吓.因此,他得保证一辆车中,两队球迷的个数差的绝对值在I(1≤I≤N)内.除非那辆车上只有J队或H队的球 迷.
    给出奶牛上车的次序,请计算出最少几辆汽车可以解决问题.

Input

    第1行输入两个分开的整数N和J;接下来N行表示奶牛们在仓房中排队的顺序.用J和H表示
她们是J队和H队昀球迷.

Output

    一个整数,表示最少汽车的数量.

Sample Input

14 3
H J H H H J H J H H H H H H

Sample Output

2


dp[x]表示前x头牛最少需要几辆车

转移:dp[x] = min(dp[i]+1,  区间[i+1, x]内所有牛能在1辆车上)


#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
int a[2505], dp[2505], sum[2505];
int main(void)
{
	char ch;
	int n, k, i, j;
	scanf("%d%d", &n, &k);
	for(i=1;i<=n;i++)
	{
		scanf(" %c", &ch);
		if(ch=='J')  a[i] = 1;
		dp[i] = i;
		sum[i] = sum[i-1]+a[i];
	}
	for(i=1;i<=n;i++)
	{
		for(j=0;j<=i-1;j++)
		{
			if((sum[i]-sum[j])%(i-j)==0 || abs((i-j)-2*(sum[i]-sum[j]))<=k)
				dp[i] = min(dp[i], dp[j]+1);
		}
	}
	printf("%d\n", dp[n]);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值