uvalive6913 I Want That Cake(博弈dp)
2016-10-22 19:41
417 查看
引自:http://www.cnblogs.com/qscqesze/p/5734143.html
题意:
有两支队,每只队都有n个人,一共有m个蛋糕,每个人至少吃一个,最多吃k个。
都采取最优策略,谁吃到最后一个蛋糕,那么那只队就胜利。
按照给定的顺序去吃蛋糕,问你最后谁胜利。
思路:
先缩点,把相同的点都缩成一个点。
那么就变成了ABABABA这样交替的形式了,然后跑DP就好了。
dp[i][j]代表第i层代表的队伍蛋糕还剩j个时的状态
0为必败态,1为必胜态
首先,能把蛋糕吃完的状态为必胜态
然后,能到达必败态的状态为必胜态
只能到达必胜态的状态为必败态
递归回0,m的状态,如果为必胜态则输出第一个吃蛋糕的队伍
否则输出第二个吃蛋糕的队伍
题意:
有两支队,每只队都有n个人,一共有m个蛋糕,每个人至少吃一个,最多吃k个。
都采取最优策略,谁吃到最后一个蛋糕,那么那只队就胜利。
按照给定的顺序去吃蛋糕,问你最后谁胜利。
思路:
先缩点,把相同的点都缩成一个点。
那么就变成了ABABABA这样交替的形式了,然后跑DP就好了。
dp[i][j]代表第i层代表的队伍蛋糕还剩j个时的状态
0为必败态,1为必胜态
首先,能把蛋糕吃完的状态为必胜态
然后,能到达必败态的状态为必胜态
只能到达必胜态的状态为必败态
递归回0,m的状态,如果为必胜态则输出第一个吃蛋糕的队伍
否则输出第二个吃蛋糕的队伍
/* *********************************************** Author :devil ************************************************ */ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <stack> #include <map> #include <string> #include <cmath> #include <stdlib.h> #define LL long long #define rep(i,a,b) for(int i=a;i<=b;i++) #define dep(i,a,b) for(int i=a;i>=b;i--) #define ou(a) printf("%d\n",a) #define pb push_back #define mkp make_pair template<class T>inline void rd(T &x) { char c=getchar(); x=0; while(!isdigit(c))c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } } #define IN freopen("in.txt","r",stdin); #define OUT freopen("out.txt","w",stdout); using namespace std; const int inf=0x3f3f3f3f; const int mod=1e9+7; const int N=2e3+10; char s ; int dp ,t,n,m,k,cas; vector<int>eg; bool dfs(int x,int y) { if(y<=0) return 0; if(x==eg.size()) return 1; if(dp[x][y]!=-1) return dp[x][y]; int &ans=dp[x][y]; ans=0; for(int i=eg[x]*k;i>=eg[x];i--) if(!dfs(x+1,y-i)) return ans=1; return ans; } int main() { #ifndef ONLINE_JUDGE IN #endif scanf("%d",&t); while(t--) { scanf("%d%d%d%s",&n,&m,&k,s+1); printf("Case #%d: ",++cas); n<<=1; eg.clear(); memset(dp,-1,sizeof(dp)); for(int i=1;i<=n;) { int j=i+1; while(j<=n&&s[j]==s[i]) j++; eg.pb(j-i); i=j; } if(dfs(0,m)) printf("%c\n",s[1]); else printf("%c\n",s[1]=='A'?'B':'A'); } return 0; }
相关文章推荐
- UVALive 6913 I Want That Cake 博弈dp
- UVALive 6913 I Want That Cake 博弈dp
- UVALive 6913 I Want That Cake【博弈+记忆化搜索】【好题】
- UVALive 6913 I Want That Cake 博弈+dp
- HDU 4778 Gems Fight! (博弈+状压DP)
- Codeforces Round #343 (Div. 2) D. Babaei and Birthday Cake 线段树维护dp
- UVa 10891 Game of Sum (区间DP&博弈)
- 歌曲试听: i want it that way
- UVA 10891 区间DP+博弈思想
- Codeforces Round #284 (Div. 1) B. Name That Tune(概率DP)(难)
- 博弈DP专题
- UVa 12525 Boxes and Stones (dp 博弈)
- Codeforces Round #284 (Div. 1) B. Name That Tune(概率DP)(难)
- 【HDU5653 BestCoder Round 77 (div1) C】【DP 复杂度计算】Bomber Man wants to bomb an Array n炸弹设置爆炸左右界 最大爆炸力的乘积
- 【HDU 5653】Bomber Man wants to bomb an Array.|DP
- Cake - ZOJ 3537 凸包+dp三角划分
- POJ2068_Nim_DP博弈
- nyoj 1030 Yougth's Game[Ⅲ](区间dp 博弈组合题)
- ZOJ - 3537 Cake 凸包+区间DP
- Codeforces Round #284 (Div. 2): D. Name That Tune(概率DP)