硬币游戏2&&Cutting Game——Grundy值
Grundy值
当前状态的Grundy值就是除任意一步所能转移到的状态的Grundy值以外的最小非负整数,
以硬币问题一为例,可写成:
int init_grundy()
{
sg[] = ;
for(int i = ;i <= x;i++) //递推求前x个SG值
{
set<int>st;
for(int j = ;j < k;j++)
if(a[j] <= i) st.insert(sg[i - a[j]]); int g = ;
while(st.count(g)) g++;
sg[i] = g;
}
}
Grundy值有什么用呢?
它的作用是巨大的,利用它,不光可以解决这个问题,其它许多问题都可以转换成前面介绍的Nim问题,即问题的解等于子问题的异或和。
Nim问题为什么等于异或和之前口胡过,这些问题为什么等于子问题的Grundy值的异或和呢?
根据Grundy的定义,先看下Grundy的性质(与Nim对比):
- Nim中有x颗石子的石子堆,能够转移成0, 1, 2, ..., x-1可石子的石子堆
- 从Grundy值为x的状态出发,也能转移到Grundy值为0, 1, 2, ,,,,, x-1的状态
也就不难理解为什么是异或和了:当必败态为Grundy异或和为0是,能保证必败态只能变成必胜态;必胜态可以转成必败态。
为了保证Grundy值为x的状态能转移为小于x的状态,Grundy的定义设为不在子问题Grundy值中的最小值(也就是说小于x的Grundy值都存在于子问题中)//好像有点循环论证,,,醒醒,这也能叫证明,,,个人理解吧
也不难发现,Nim问是Grundy问题的特例,其单堆的Grundy值为x。
例题
1、硬币游戏2
就是个堆Grundy值得异或和,异或和为0先手必败,否则先手必胜。
2、Cutting Game
题目:有一张 $w \times h$ 个格子的长方形纸,两个人轮流切割,水平或者垂直的切成两部分,最小切出单个格子($1 \times 1$)的一方获胜。当双方都采取最佳策略时,谁会获胜?
分析:
这样会发生分割的游戏,也能够计算Grundy值。(为啥啊??)
当一张 $w \times h$ 的纸张分割成两张时,假设所得的纸张的Grundy值分别为 $g_1$ 和 $g_2$,则这两张纸对应的状态的Geundy值为 $g_1 \ XOR \ g_2$。
另外,易知,一旦切割出长或宽为1时,下一步就一定能够切出 $1 \times 1$的纸张,所以知道此时必败。因此切割纸张时总要保证长和宽至少为2.
不然,grundy(2,2) 时 st{ grundy(1,2)^grundy(1,2), grundy(2,1)^grundy(2,1) },则sg[2]=1先手必胜;而实际上先手必败。
(为什么硬币问题不要考虑转译成必败态,不懂,哪个大佬能教教我)
#include<cstdio>
#include<set>
#include<cstring>
using namespace std; const int maxw = +;
const int maxh = +;
int sg[maxw][maxh]; int grundy(int w, int h)
{
//printf("%d %d\n", w, h);
int& ret = sg[w][h];
if(ret != -) return ret;
if(w== || h==) return ret=; set<int>st;
for(int i = ;i < w-;i++) st.insert(grundy(i, h) ^ grundy(w-i, h));
for(int i = ;i < h-;i++) st.insert(grundy(w, i) ^ grundy(w, h-i));
ret = ;
while(st.count(ret)) ret++;
return ret;
} int w, h; int main()
{
memset(sg, -, sizeof(sg));
while(scanf("%d%d", &w, &h) == )
{
if(grundy(w, h)==) printf("LOSE\n");
else printf("WIN\n");
}
return ;
}
硬币游戏2&&Cutting Game——Grundy值的更多相关文章
- 4.1.6 Grundy数-硬币游戏2
Problem Description: Alice 和 Bob 在玩一个游戏.给定 k 个数字 a1,a2,……,ak.一开始,有n堆硬币,每堆各有 Xi 枚硬币.Alice 和 Bob 轮流选出一 ...
- 博弈论:寻找先手必胜策略——Grundy值
选修了人工智能课程,老师布置了调研任务:Grundy,开始看了一些资料并没有看懂. 后来找到了一篇文,写的很棒,里面有好多博弈相关的问题与分析,分享出来给大家: http://endless.logd ...
- 1289 大鱼吃小鱼 1305 Pairwise Sum and Divide 1344 走格子 1347 旋转字符串 1381 硬币游戏
1289 大鱼吃小鱼 有N条鱼每条鱼的位置及大小均不同,他们沿着X轴游动,有的向左,有的向右.游动的速度是一样的,两条鱼相遇大鱼会吃掉小鱼.从左到右给出每条鱼的大小和游动的方向(0表示向左,1表示向右 ...
- BZOJ 1411&&Vijos 1544 : [ZJOI2009]硬币游戏【递推,快速幂】
1411: [ZJOI2009]硬币游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 897 Solved: 394[Submit][Status ...
- bzoj1411: [ZJOI2009]硬币游戏
1411: [ZJOI2009]硬币游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 965 Solved: 420[Submit][Status ...
- HDU 3537 Mock Turtles型翻硬币游戏
题目大意: 每次可以翻1个或者2个或者3个硬币,但要保证最右边的那个硬币是正面的,直到不能操作为输,这题目还有说因为主人公感情混乱可能描述不清会有重复的硬币说出,所以要去重 这是一个Mock Turt ...
- 51nod1381 硬币游戏
1381 硬币游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 有一个简单但是很有趣的游戏.在这个游戏中有一个硬币还有一张桌子,这张桌子上有很多平 ...
- TYVJ P1075 硬币游戏 Label:dp
背景 农民John的牛喜欢玩硬币,所以John就为它们发明了一个新的两人硬币游戏,叫做Xoinc. 描述 最初地面上有一堆n个硬币(5<=n<=2000),从上面数第i个硬币的价值为C_i ...
- tyvj P1075 - 硬币游戏 博弈DP
P1075 - 硬币游戏 From price Normal (OI)总时限:10s 内存限制:128MB 代码长度限制:64KB 背景 Background 农民John的牛喜欢玩 ...
随机推荐
- SQLServer --------- 将sql脚本文件导入数据库
创建数据库方法有两种 第一种通过图形化的操作界面 第二种通过 sql 语句 sql server 如何执行.sql 文件,的原理就是执行sql语句进行创建 打开数据库后找到 最左侧文件 找到需要执 ...
- [转帖]k8s 部署问题解决
k8s 部署问题解决 https://www.jianshu.com/p/f53650a85131 本文记录一下在部署 k8s 时遇到的一些问题及解决方法,具体部署流程可以参考 ubuntu 安装 k ...
- easydict的使用方法
easydict的作用:可以使得以属性的方式去访问字典的值 from easydict import EasyDict as edict a=['8',2,3]a=edict()a.f=99print ...
- python基础知识(一)
Python基础知识 计算基础知识 1.cpu 人类的大脑 运算和处理问题 2.内存 临时存储数据 断电就消失了 3.硬盘 永久存储数据 4.操作系统 调度硬件设备之间数据交互 python的应用和历 ...
- python 日期、时间、字符串相互转换
python 日期.时间.字符串相互转换 在python中,日期类型date和日期时间类型dateTime是不能比较的. (1)如果要比较,可以将dateTime转换为date,date不能直接转换为 ...
- 来自GitHub的优秀开源项目系列
开发必看: 如何设计大型系统? 架构师技术图谱. 互联网Java工程师进阶扫盲 Java学习指南 Java工程师成神之路 有趣开源项目: 中华古诗词数据库 表情包博物馆
- IT之快速提高效率的方法与思考
前言 文章也没什么很高深的问题,大概花个5分钟能看完.是一些大家都知道的道理,作为提醒与总结. 关于提高方面的内容,一般都有个人的方法,但大致都一致.可分为几个步骤. 框架.工具使用相关 使用框架.工 ...
- JavaScript设计模式与开发实践随笔(一)
编程语言按照数据类型大体可以分为两类,一类是静态类型语言,另一类是动态类型语言. 静态类型语言在编译时便已确定变量的类型,而动态类型语言的变量类型要到程序运行的时 候,待变量被赋予某个值之后,才会具有 ...
- 冬虫夏草winterwormsummerherb英语
“中药之王”--冬虫夏草WinterwormSummerherb King of Chinese medicine --WinterwormSummerherb “冬天是虫,夏天是草,冬虫夏草是个宝. ...
- BDOC ROUTER
BAPI_CRM_SAVECRM_GENERIC_CRM_INMAP_BAPIMTCS_AND_PROCESSCRM_DOWNLOAD_MAP_TO_MBDOCCRM_SALESDOC_MAP_BAP ...