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. Codeforces Round #547 (Div. 3) D

    http://codeforces.com/contest/1141/problem/D 题目大意: 鞋子匹配,用一个小写字母表示一种颜色.L[i]表示左脚的颜色,R[i]表示右脚的颜色,只有当L[i ...

  2. [整理]ASP.NET MVC 5

    1.入门 1.1官方资料 http://www.asp.net/mvc/overview/getting-started/introduction/getting-started 疑问: startu ...

  3. 【问题收集·知识储备】Xcode只能选择My Mac,不能选择模拟器如何解决?

      网友问题:请问打开一个应用,只能选择My Mac,不能选择模拟器如何解决? 答案:             下面将问答过程记录如下:     CHENYILONG Blog 请问打开一个应用,只能 ...

  4. python所有基础

    下面就不一一列举了,所有的资料都和GitHub对接,到时候我有更新就直接拖到GitHub上面了.入门的小伙伴们可以进来看看,估计后面还会有很多项目,待更新.

  5. 利用overflow-x实现横向滚动的xiaoguo

    在进行app开发中经常遇到横向滚动的效果,相信很多人都是用js写的吧,其实用css的overflow-x也可以写出啦哦~~~ (1)介绍overflow-x: 1)浏览器支持 所有主流浏览器都支持 o ...

  6. aps.net webform框架下页面服务器端控件和html控件用法

    (1)select 下拉框 前端: <select name="gameserverlist" id="gameserverlist" runat=&qu ...

  7. ACM数据对拍程序

    #include<cstdio> #include<cstdlib> #include<ctime> int main() { long s,t; while(1) ...

  8. 【SVN】命令行忽略不必要的文件和文件夹

    SVN命令参考:   https://www.cnblogs.com/wlsxmhz/p/5775393.html 我们需要明白命令行设置忽略文件和文件夹是通过设置svn:ignore属性设置的,pr ...

  9. 【Python】测试dpkt解析pcap

    1.前言 本想借助dpkt解析mail.dns.http来辅助分析pcap包进行分析,查阅资料学习却发现并不如使用scapy那么方便. dpkt是一个python模块,可以对简单的数据包创建/解析,以 ...

  10. TCP长连接和短连接的区别【转】

    转自:https://www.cnblogs.com/onlysun/p/4520553.html 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接, ...