您的位置:首页 > Web前端

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

2018-03-18 19:29 555 查看

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 3H 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
);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: