I Want That Cake

题目连接:

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4925

Description

There was an interesting game played on a popular Korean reality TV Show. 12 players in 3 teams

— 4 persons in each team — lined up in one row in random order. The game master approaches the

players one by one starting from the most front player, with a tray full of 31 cakes. Each player should

eat at least 1 and at most 5 cakes during his/her turn. The player who eats the last cake will lose

along with his/her group (this is a team game). It was more an entertainment show rather than a real

competition. The players were selected from “chubby” celebrities who like to eat, thus causing them

in dilemma whether they should win the game (which might require them to hold their urge to eat the

cakes), or just enjoy all 5 cakes ignoring their team member.

This problem is related to the game. There are 2 teams (A and B) each with N players lined up

in a row in random order. Initially there are M cakes in the tray, and each player (starting from the

most front) has to eat at least 1 and at most K cakes during his/her turn. The team whose player eat

the last cake win (note that this is different compared to the original game).

Your task is to determine which team will win the game, given both teams play optimally.

Input

The first line of input contains an integer T (T ≤ 100) denoting the number of cases. Each case begins

with three integers N, M, and K (1 ≤ N ≤ 1, 000; 1 ≤ K ≤ M ≤ 2 ∗ N) in a line denoting the number

of players in each team, the initial number of cakes, and the maximum number of cakes can be eaten

by each player in his/her turn respectively. The next line contains a string S representing the players

order from the front most to the last player. S consists of only character ‘A’ or ‘B’ representing which

team does the respective player belongs to. The length of S is exactly 2 ∗ N and the number of ‘A’ and

‘B’ will be equal.

Output

For each case, output ‘Case #X: Y ’, where X is the case number starts from 1 and Y is ‘A’ if the

game will be won by team A, otherwise ‘B’. Assume both teams will play the game optimally to win

the game.

Explanation for 1st sample case:

The first two players of team A each needs to eat 2 cakes, while the third A player eats the last

cake.

Explanation for 2nd sample case:

No matter what team A do, the last cake will be eaten by one of team B’s player.

Explanation for 3rd sample case:

To ensure their win, the first player (B) should eat 2 cakes, leaving only 3 cakes to the next player

(A). This player (A) should eat at least 1 and at most 2 cakes. No matter how many cakes this player

eats, the next player (B) will eat the last cake.

Sample Input

4

3 5 2

AAABBB

4 7 2

AAABBBBA

4 5 2

BABABABA

4 6 3

BAABBABA

Sample Output

Case #1: A

Case #2: B

Case #3: B

Case #4: A

Hint

题意

有两支队,每只队都有n个人,一共有m个蛋糕,每个人至少吃一个,最多吃k个。

都采取最优策略,谁吃到最后一个蛋糕,那么那只队就胜利。

按照给定的顺序去吃蛋糕,问你最后谁胜利。

题解:

先缩点,把相同的点都缩成一个点。

那么就变成了ABABABA这样交替的形式了,然后跑DP就好了。

但是这个DP好像是n^3的,其实你有break,所以跑起来还是蛮快的,当然,你吃蛋糕得倒着枚举。

代码

#include <bits/stdc++.h>
#define rep(a,b,c) for(int (a)=(b);(a)<=(c);++(a))
#define drep(a,b,c) for(int (a)=(b);(a)>=(c);--(a))
#define pb push_back
#define mp make_pair
#define sf scanf
#define pf printf
#define two(x) (1<<(x))
#define clr(x,y) memset((x),(y),sizeof((x)))
#define dbg(x) cout << #x << "=" << x << endl;
#define lowbit(x) ((x)&(-x))
const int mod = 1e9 + 7;
int mul(int x,int y){return 1LL*x*y%mod;}
int qpow(int x , int y){int res=1;while(y){if(y&1) res=mul(res,x) ; y>>=1 ; x=mul(x,x);} return res;}
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}
using namespace std;
const int maxn = 1000 + 15;
int N , M , K , dp[2 * maxn][maxn * 2];
char str[maxn * 2];
vector < int > op; int dfs( int x , int y ){
if( y <= 0 ) return 0;
if( dp[x][y] != -1 ) return dp[x][y];
int & ans = dp[x][y] = 0;
if( x == op.size() ) return ans = 1;
for(int i = op[x] * K ; i >= op[x] ; -- i){
int rs = dfs( x + 1 , y - i );
if( rs == 0 ) return ans = 1;
}
return ans;
} int main(int argc,char *argv[]){
int T=read(),cas=0;
while(T--){
N=read(),M=read(),K=read();
sf("%s",str + 1);
op.clear();
for(int i = 1 ; i <= N * 2 ; ){
int j;
for(j = i ; j <= N * 2 && str[i] == str[j] ; ++ j );
op.pb( j - i );
i = j;
}
for(int i = 0 ; i <= op.size() ; ++ i) for(int j = 0 ; j <= M ; ++ j) dp[i][j] = -1;
pf("Case #%d: ", ++ cas);
if( dfs( 0 , M ) ) pf("%c\n" , str[1]);
else{
if( str[1] == 'A' ) pf("%c\n" , 'B');
else pf("%c\n" , 'A');
}
}
return 0;
}

UVALive 6913 I Want That Cake 博弈dp的更多相关文章

  1. UVALive 6913 I Want That Cake 博弈+dp

    题目链接: http://acm.hust.edu.cn/vjudge/problem/96343 I Want That Cake Time Limit: 3000MS 64bit IO Forma ...

  2. HDU 5623 KK's Number (博弈DP)

    KK's Number 题目链接: http://acm.hust.edu.cn/vjudge/contest/121332#problem/K Description Our lovely KK h ...

  3. 博弈dp 以I Love this Game! POJ - 1678 为例

    写在前面的话 知识基础:一些基础的博弈论的方法,动态规划的一些知识 前言:博弈论就是一些关于策略或者游戏之间的最优解,动态规划就是对于一些状态之间转移的一些递推式(or 递归),dp分为很多很多种,比 ...

  4. 博弈dp入门 POJ - 1678 HDU - 4597

    本来博弈还没怎么搞懂,又和dp搞上了,哇,这真是冰火两重天,爽哉妙哉. 我自己的理解就是,博弈dp有点像对抗搜索的意思,但并不是对抗搜索,因为它是像博弈一样,大多数以当前的操作者来dp,光想是想不通的 ...

  5. zoj 3537 Cake 区间DP (好题)

    题意:切一个凸边行,如果不是凸包直接输出.然后输出最小代价的切割费用,把凸包都切割成三角形. 先判断是否是凸包,然后用三角形优化. dp[i][j]=min(dp[i][j],dp[i][k]+dp[ ...

  6. tyvj P1075 - 硬币游戏 博弈DP

    P1075 - 硬币游戏 From price    Normal (OI)总时限:10s    内存限制:128MB    代码长度限制:64KB 背景 Background 农民John的牛喜欢玩 ...

  7. ZOJ 3905 Cake(贪心+dp)

    动态规划题:dp[i][j]表示有i个Cake,给了Alice j个,先按照b排序,这样的话,能保证每次都能成功给Alice Cake,因为b从大到小排序,所以Alice选了j个之后,Bob最少选了j ...

  8. UVA 1558 - Number Game(博弈dp)

    UVA 1558 - Number Game 题目链接 题意:20之内的数字,每次能够选一个数字,然后它的倍数,还有其它已选数的倍数组合的数都不能再选,谁先不能选数谁就输了,问赢的方法 思路:利用dp ...

  9. 计蒜客 取数游戏 博弈+dp

    题目链接 取数游戏 思路:dp(x, y)表示先手在区间[x, y]能取得的最大分数.当先手取完,就轮到后手去,后手一定会选择当前能令他得到最大分数的策略,其实当先手在[x, y]区间两端取走一个数, ...

随机推荐

  1. 转自知乎大神----JS 闭包是什么

    大名鼎鼎的闭包!这一题终于来了,面试必问. 请用自己的话简述 什么是「闭包」. 「闭包」的作用是什么. --------------------------------------- 首先来简述什么是 ...

  2. mybatis mapper接口开发dao层

    本文将探讨使用 mapper接口,以及 pojo 包装类进行 dao 层基本开发 mybatis dao 层开发只写 mapper 接口 其中需要 开发的接口实现一些开发规范 1. UserMappe ...

  3. [转载]DOMContentLoaded与interactive

    http://www.cnblogs.com/muxrwc/archive/2011/01/13/1934379.html ie中inline script执行时竟然第一次进入页面,doc.ready ...

  4. 利用fiddler来模拟低速环境

    为了让我们的站点拥有更好的用户体验,更短的加载时间,我们会“按需加载”页面的资源. 在调试程序的时候,我们希望能有一个低速率的网络环境来模拟真实线上的环境,这个时候fiddler(下载fiddler请 ...

  5. 20155339 2016-2017-2 《Java程序设计》第6周学习总结

    20155339 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 第十章 串流设计 Java将输入/输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象 ...

  6. 多源复制遇到CREATE USER FAILED错误

    MySQL Multi-Source Replication enables a replication slave to receive transactions from multiple sou ...

  7. Ubuntu下ibus在firefox浏览器中选中即删除的解决办法

    Ubuntu上的firefox更新到36版后,ibus在浏览器中输入中文时选中的文字就会被删除.这个问题在很多贴吧.论坛上也有讨论,不过很多方法都无效.最简单有效的办法就是在命令行输入 ibus-se ...

  8. linux笔记_day10_shell编程

    1.shell编程 编程语言 静态语言:编译型语言 强类型(变量在使用前,必须事先声明) 事先转换成可执行语言 动态语言:解释型语言 弱类型(变量用时声明,拿来直接用,甚至不区分数据类型,一般默认都为 ...

  9. 安装asp.net mvc4后mvc3项目编译报错

    安装asp.net mvc4之后,之前的mvc3项目编译时报这个错“The type System.Web.Mvc.ModelClientValidationRule exists in both c ...

  10. 搜索引擎ElasticSearchV5.4.2系列二之ElasticSearchV5.4.2+kibanaV5.4.2+x-packV5.4.2安装

    相关博文: 搜索引擎ElasticSearchV5.4.2系列一之ES介绍 搜索引擎ElasticSearchV5.4.2系列二之ElasticSearchV5.4.2+klanaV5.4.2+x-p ...