题目

Alice和Bo在玩这样一个游戏,给定 $k$ 个数字 $a_1, a_2,..,a_k$.一开始有 $x$ 枚硬币,Alice和Bob轮流取硬币。每次所取的硬币的枚数一定要在 $k$ 个数当中。Alice先取,取走最后一枚的获胜。当双方都采取最有策略时,谁会获胜?假设 $k$ 个数中一定有1.($1 \leq x\leq 1000,1\leq k\leq 100$)

分析

至少,可以爆搜。加个记忆化就过了。

  • $x=0$ 是必败态
  • 如果对于某个 $i$,$x-a_i$ 是必败态,$x$ 就是必胜态
  • 如果对于任意的 $i$,$x-a_i$ 都是必胜态,则 $x$ 是必败态
#include<bits/stdc++.h>
using namespace std; const int maxn = + ;
const int maxx = + ;
int x, n, a[maxn];
int res[maxx]; int dfs(int x)
{
//printf("x:%d\n", x);
int& ret = res[x];
if(ret) return ret;
if(x == ) return ret=-;
bool flag = false;
for(int i = ;i < n;i++)
{
if(x >= a[i])
{
int tmp = dfs(x-a[i]);
if(tmp == -) return ret=;
if(tmp == ) flag = true;
}
}
return ret = (flag ? : -);
} int main()
{
scanf("%d%d", &x, &n);
for(int i = ;i < n;i++) scanf("%d", &a[i]);
//printf("%d\n", dfs(x));
int t = dfs(x);
if(t == ) printf("");
else printf("-1\n");
}

其实,上面代码就是DP的记忆化搜索,写成递推的形式:

#include<bits/stdc++.h>
using namespace std; const int maxn = + ;
const int maxx = + ;
int x, n, a[maxn];
int res[maxx]; void solve()
{
res[] = -;
for(int i = ;i <= x;i++)
{
res[i] = -; //易知,这个游戏没有平局
for(int j = ;j < n;j++) if(i >= a[j])
if(res[i-a[j]] == -) res[i] = ; //如果可以让后手达到必败态,则先手必胜
}
} int main()
{
scanf("%d%d", &x, &n);
for(int i = ;i < n;i++) scanf("%d", &a[i]);
solve();
printf("%d\n", res[x]);
return ;
}

硬币游戏1——打表&&记忆化搜索的更多相关文章

  1. BZOJ4513 SDOI2016 储能表 记忆化搜索(动态规划)

    题意: 题面中文,不予翻译:SDOI2016储能表 分析: 据说有大爷用一些奇怪的方法切掉了这道题%%%%% 这里用的是大众方法——动态规划. 其实这是一道类似于二进制数位dp的动态规划题,(但是实际 ...

  2. HDU 1028 Ignatius and the Princess III 整数的划分问题(打表或者记忆化搜索)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1028 Ignatius and the Princess III Time Limit: 2000/1 ...

  3. 洛谷P1057 传球游戏(记忆化搜索)

    点我进入题目 题目大意:n个小孩围一圈传球,每个人可以给左边的人或右边的人传球,1号小孩开始,一共传m次,请问有多少种可能的路径使球回到1号小孩. 输入输出:输入n,m,输出路径的数量. 数据范围:4 ...

  4. 2017广东工业大学程序设计竞赛决赛 题解&源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)

    心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起“唱” ...

  5. 【BZOJ-3895】取石子 记忆化搜索 + 博弈

    3895: 取石子 Time Limit: 1 Sec  Memory Limit: 512 MBSubmit: 263  Solved: 127[Submit][Status][Discuss] D ...

  6. HDU1978 记忆化搜索

    How many ways Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  7. 记忆化搜索 codevs 2241 排序二叉树

    codevs 2241 排序二叉树 ★   输入文件:bstree.in   输出文件:bstree.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 一个边长为n的正三 ...

  8. HDU 1176 免费馅饼(记忆化搜索)

    免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  9. CoderForces 280B(记忆化搜索)

    题目大意:一个纸牌游戏,52张纸牌排成一列,每张纸牌有面值和花色两种属性.每次操作可以用最后一张纸牌将倒数第二张或者倒数第四张替换,但前提是两张牌的花色或者面值相同.问最终能否只剩一张牌. 题目分析: ...

随机推荐

  1. xunsearch搜索测试

    1.导入测试数据 cd $prefix/sdk/php util/Indexer.php --source=csv --clean demo 然后出现 初始化数据源 ... csv WARNING: ...

  2. [转帖]String、StringBuilder与StringBuffer

    String.StringBuilder与StringBuffer https://www.jianshu.com/p/37f3799bdb56 1.String String本质 String是不可 ...

  3. something want to write

    1.时间戳不能相信是因为机器时间有误差.相当于机器不断电的跑着时钟. 2.写log的时候记得log别人的ip,不然没办法很好的debug.

  4. 图论 --- 骑士周游问题,DFS

    A Knight's Journey   Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 28630   Accepted: ...

  5. 关于AQS的一点总结

    关于AQS的一点总结 2017年03月13日 09:48:13 那只是一股逆流 阅读数:772    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/ ...

  6. 【转载】数字IC设计流程及开发工具

    原文链接:https://www.zhihu.com/question/28322269/answer/42048070 Design Flow &amp;lt;img src="h ...

  7. Python格式化输出——format用法示例

    format OR % 提到Python中的格式化输出方法,一般来说有以下两种方式: print('hello %s' % 'world') # hello world print('hello {} ...

  8. CF1190E Tokitsukaze and Explosion 二分、贪心、倍增、ST表

    传送门 最小值最大考虑二分答案,不难发现当最小值\(mid\)确定之后,原点到所有直线的距离一定都是\(mid\)时才是最优的,也就是说这些直线一定都是\(x^2+y^2=mid^2\)的切线. 接下 ...

  9. 『正睿OI 2019SC Day3』

    容斥原理 容斥原理指的是一种排重,补漏的计算思想,形式化的来说,我们有如下公式: \[\left | \bigcup_{i=1}^nS_i \right |=\sum_{i}|S_i|-\sum_{i ...

  10. JavaScript由来

    在互联网时代,网速还很差劲的时候,表单输入数据的合法性验证需要与服务器交换数据,从而加重了使用者的负担. 网景公司为了解决这种简单问题开发了JavaScript.在1995年2月网景公司在发布自己的浏 ...