UVALive 6913 I Want That Cake 博弈+dp
题目链接:
http://acm.hust.edu.cn/vjudge/problem/96343
I Want That Cake
Time Limit: 3000MS
64bit IO Format: %lld & %llu
题意
有m块饼,有两个队各n个人站成一排,现在从第一个人开始吃饼,每个人至少吃一个最多吃k个,最后吃到饼的人所在的队伍胜,现在双方都采取最优策略,问哪个队能胜。
题解
如果两个队站队的形式是ABABAB,那么这就是个明显的博弈论了,然后并不一定是这样站的,不过没关系,我们可以把相邻的相同队伍的看成一个人,那么久变成ABABA的形式了,虽然这样处理之后每个‘人’能吃的饼的限制不同了,但是我们可以直接干一发dfs(记忆化),根据必胜态推出所有的状态。
注:必胜态:存在一个后继为必败态;必败态:所有的后继都为必胜态
代码
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
#define scf scanf
#define prf printf
typedef long long LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII;
const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-8;
const double PI = acos(-1.0);
//start----------------------------------------------------------------------
const int maxn=2222;
int n,m,k;
int dp[maxn][maxn];
char str[maxn];
VI lis;
int dfs(int cur,int lef){
if(dp[cur][lef]!=-1) return dp[cur][lef];
int& ret=dp[cur][lef];
if(lef<=lis[cur]*k) return ret=1;
ret=0;
for(int i=lis[cur];i<=lis[cur]*k;i++){
if(dfs(cur+1,lef-i)==0) return ret=1;
}
return ret;
}
void init(){
clr(dp,-1);
lis.clear();
}
int main() {
int tc,kase=0;
scf("%d",&tc);
while(tc--){
init();
scf("%d%d%d",&n,&m,&k);
scf("%s",str); int len=strlen(str);
for(int i=0;i<len;i++){
int j=i;
while(j<len&&str[i]==str[j]) j++; j--;
lis.pb(j-i+1);
i=j;
}
int ans=dfs(0,m);
prf("Case #%d: ", ++kase);
if(ans){
if(str[0]=='A') puts("A");
else puts("B");
}else{
if(str[0]=='A') puts("B");
else puts("A");
}
}
return 0;
}
//end-----------------------------------------------------------------------
UVALive 6913 I Want That Cake 博弈+dp的更多相关文章
- UVALive 6913 I Want That Cake 博弈dp
I Want That Cake 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemi ...
- HDU 5623 KK's Number (博弈DP)
KK's Number 题目链接: http://acm.hust.edu.cn/vjudge/contest/121332#problem/K Description Our lovely KK h ...
- 博弈dp 以I Love this Game! POJ - 1678 为例
写在前面的话 知识基础:一些基础的博弈论的方法,动态规划的一些知识 前言:博弈论就是一些关于策略或者游戏之间的最优解,动态规划就是对于一些状态之间转移的一些递推式(or 递归),dp分为很多很多种,比 ...
- 博弈dp入门 POJ - 1678 HDU - 4597
本来博弈还没怎么搞懂,又和dp搞上了,哇,这真是冰火两重天,爽哉妙哉. 我自己的理解就是,博弈dp有点像对抗搜索的意思,但并不是对抗搜索,因为它是像博弈一样,大多数以当前的操作者来dp,光想是想不通的 ...
- zoj 3537 Cake 区间DP (好题)
题意:切一个凸边行,如果不是凸包直接输出.然后输出最小代价的切割费用,把凸包都切割成三角形. 先判断是否是凸包,然后用三角形优化. dp[i][j]=min(dp[i][j],dp[i][k]+dp[ ...
- tyvj P1075 - 硬币游戏 博弈DP
P1075 - 硬币游戏 From price Normal (OI)总时限:10s 内存限制:128MB 代码长度限制:64KB 背景 Background 农民John的牛喜欢玩 ...
- ZOJ 3905 Cake(贪心+dp)
动态规划题:dp[i][j]表示有i个Cake,给了Alice j个,先按照b排序,这样的话,能保证每次都能成功给Alice Cake,因为b从大到小排序,所以Alice选了j个之后,Bob最少选了j ...
- UVA 1558 - Number Game(博弈dp)
UVA 1558 - Number Game 题目链接 题意:20之内的数字,每次能够选一个数字,然后它的倍数,还有其它已选数的倍数组合的数都不能再选,谁先不能选数谁就输了,问赢的方法 思路:利用dp ...
- 计蒜客 取数游戏 博弈+dp
题目链接 取数游戏 思路:dp(x, y)表示先手在区间[x, y]能取得的最大分数.当先手取完,就轮到后手去,后手一定会选择当前能令他得到最大分数的策略,其实当先手在[x, y]区间两端取走一个数, ...
随机推荐
- vue中渲染页面,动态设置颜色
for循环中动态设置页面的图标或者字体颜色与循环中且套循环 :style="{'color':items.color}" 案例代码: html中 <div class=&qu ...
- PHP中的递增/递减运算符
看这段代码 <?php $a=10; $b=++$a; //此语句等同于 ; $a=$a+1 ; $b=$a echo $a."<br>"; echo $b; ? ...
- Unity判断鼠标是否在UI(UGUI)上
"EventSystem.current.IsPointerOverGameObject()" UI和3D场景同时都需要响应触摸事件,如果同时响应可能就会出现触摸UI的时候影响到了 ...
- 面试:HashSet怎么判断重复
HashSet是基于HashMap实现的,元素的值存储在key上,value的值所有元素都一样,都是这个 private static final Object PRESENT = new Objec ...
- docker 容器模式下部署mysql 主从复制
1.计划用两台host来部署,分别部署一台 mysql,一主一从,2.配置好主从mysql配置文件,更改文件名即可[client]port = 3306socket = /var/run/mysqld ...
- 生成并调用so动态库
本文更新于2019-01-03. 生成库 头文件fn.h如下: #ifndef __FN_H__ #define __FN_H__ #ifdef __cplusplus extern "C& ...
- CALL TRANSACTION
概要 SUBMITと違い.トランザクションコードで呼び出すのが特徴. アドオンからの伝票照会やバッチインプットによるSAPへのデータ登録/更新処理にも利用される. なお.呼び出された側から呼び出し元へ ...
- 20155321 2016-2017-2 《Java程序设计》第一周学习总结
学习目标 [√]了解Java基础知识 [√]了解JVM.JRE与JDK,并下载.安装.测试JDK [√]了解PATH.CLASSPATH.SOURCEPATH的作用并会设置 [√]初步使用IDE(推荐 ...
- 获取文件mimes
<?php /* * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licen ...
- linux 冒号用法
冒号在Linux中是一个空命令,可以认为与shell的内建命令true相同,它的返回值是0. 在while循环中 while : 与 while true 的作用是等效的 在 if/then 中可作为 ...