poj2311
博弈论——sg,mex
sg性质:1.在末态的状态点为N态。
2.P态的下一步有一个是N态
3.N态的下一步全部是P态。
当然这是对于单点一个游戏的情形,也相当于NIM只有一堆石子。
mex(minimal excludant),很俗地可以解释为:mex{S}表示S集合中从0开始,最小未出现的数字。
关于sg与mex的关系,可以引用这里http://www.cnblogs.com/Knuth/archive/2009/09/05/1561007.html的一段话:
对于一个给定的有向无环图,定义关于图的每个顶点的Sprague-Garundy函数g如下:g(x)=mex{ g(y) | y是x的后继 }。
来看一下SG函数的性质。首先,所有的terminal position所对应的顶点,也就是没有出边的顶点,其SG值为0,因为它的后继集合是空集。然后对于一个g(x)=0的顶点x,它的所有后继y都满足g(y)!=0。对于一个g(x)!=0的顶点,必定存在一个后继y满足g(y)=0。
以上这三句话表明,顶点x所代表的postion是P-position当且仅当g(x)=0(跟P-positioin/N-position的定义的那三句话是完全对应的)。
关于sg叠加的效果,很神奇发现它们满足sg(G) = sg(G1)^sg(G2)^……^sg(Gn)。对于与博弈有关的核心就是这些了。多刷刷题,自然心里就明了了。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int sg[][];
int stamp[*]={},stamps=;
int sgx(int r,int c){
stamps++;
for(int i=;i<=r-i;i++) // 1 c(只有一行)【r-1 c】 不能被继续,故需要从2开始。
stamp[sg[i][c]^sg[r-i][c]] = stamps;
for(int i=;i<=c-i;i++)
stamp[sg[r][i]^sg[r][c-i]] = stamps;
for(int i=;;i++)
if(stamp[i] < stamps)
{
sg[r][c] = i;
break;
}
return sg[r][c];
}
int main()
{
for(int i=;i<;i++)
sg[][i] = sg[i][] = ; for(int i=;i<;i++)
for(int j=i;j<;j++)
sg[i][j] = sg[j][i] = sgx(i,j);
int n,m;
while(scanf("%d%d",&n,&m) != EOF){
if(sg[n][m]) printf("WIN\n");
else printf("LOSE\n");
}
return ;
}
poj2311的更多相关文章
- [poj2311]Cutting Game_博弈论
		
Cutting Game poj-2311 题目大意:题目链接 注释:略. 想法: 我们发现一次操作就是将这个ICG对应游戏图上的一枚棋子变成两枚. 又因为SG定理的存在,记忆化搜索即可. 最后,附上 ...
 - POJ2311 Cutting Game 博弈 SG函数
		
Cutting Game Description Urej loves to play various types of dull games. He usually asks other peopl ...
 - POJ2311 Cutting Game
		
题意 Language:Default Cutting Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6007 Acc ...
 - POJ2311 Cutting Game(博弈论)
		
总时间限制: 1000ms 内存限制: 65536kB 描述 Urej loves to play various types of dull games. He usually asks other ...
 - 【博弈论】【SG函数】poj2311 Cutting Game
		
由于异或运算满足结合律,我们把当前状态的SG函数定义为 它所能切割成的所有纸片对的两两异或和之外的最小非负整数. #include<cstdio> #include<set> ...
 - SG函数博弈——poj2311
		
关于SG函数的博弈 首先定义必败态 x : SG[x]=0 设任意一个状态y,到所有y能到达的状态连一条边,令这些后继为z y : SG[y]=mex(SG[z]) SG[y]==0 : y就是必败态 ...
 - $POJ2311\ Cutting\ Game$ 博弈论
		
正解:博弈论 解题报告: 传送门! 首先看到说,谁先$balabala$,因为$SG$函数是无法解决这类问题的,于是考虑转化成"不能操作者赢/输"的问题,不难想到先剪出$1\cdo ...
 - 博弈问题之SG函数博弈小结
		
SG函数: 给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移 动者判负.事实上,这个游戏可以认为是所有Impartial Combinatorial Ga ...
 - ACM学习大纲
		
1 推荐题库 •http://ace.delos.com/usaco/ 美国的OI 题库,如果是刚入门的新手,可以尝试先把它刷通,能够学到几乎全部的基础算法极其优化,全部的题解及标程还有题目翻译可以b ...
 
随机推荐
- 测试中的代码分享~将可以合并的方法去合并Func不赖
			
在面向对象的设计中,我们经常会谈到“重构”,而重构之中有个叫合并方法的,就是将多个方法干的事类似,或者说,方法体的长向很像,那么,我们需要去考虑,将它们进行抽象! 原来的代码: /// <sum ...
 - vb.net常用函数
			
当然,这些都可以从MSDN查到,但是有时候打开帮助老慢的,所以先放到这里放一放,查个函数什么的比较快一点.都是从网上搜来的.Abs(number) 取得数值的绝对值. Asc(String) 取得字符 ...
 - Php5.3的lambda函数以及closure(闭包)
			
从php5.3以后,php也可以使用lambda function(可能你会觉得是匿名函数,的确是但不仅仅是)来写类似javascript风格的代码: $myFunc = function() { e ...
 - 勉強すべきURL
			
http://www.atmarkit.co.jp/ait/articles/1403/19/news034_2.html http://webdesignerwork.jp/web/responsi ...
 - Scala写排序可以说是简洁又明了
			
例如归并排序,清晰明了. object MergeSort extends App { val oldList = List[Int](12, 40, 26, 89, 75, 44, 32, ...
 - 3D空间坐标系转换复习
			
模型坐标系:ModelSpace 即模型本身为中心 模型本身自己 世界坐标系:WorldSpace 世界坐标系 整个世界 视角坐标系: ViewSpace 眼睛看到的范 ...
 - [原创]obj-c编程17:键值观察(KVO)
			
原文链接:[原创]obj-c编程17:键值观察(KVO) 系列专栏链接:objective-c 编程系列 说完了前面一篇KVC,不能不说说它的应用KVO(Key-Value Observing)喽.K ...
 - onActivityResult不起作用?可能是和你的launchMode有关!
			
昨天在自己的项目中用到了onActivityResult()方法获得activity的返回值.我从Activity01通过 startActivityForResult启动了Activity02和Ac ...
 - TF卡速度测试对比 Class数越高速度越快
			
存储卡(TF卡)是手机扩展存储的大杀器,让你多装n部学习资料,多装n个外语听力练习.除了装东西外,存储卡性能不佳也会影响手机的整体性能以及体验的.本文主要针对Android手机,我是懒人,但我讨厌懒人 ...
 - Delphi 的接口机制——接口操作的编译器实现过程(1)
			
学习COM编程技术也快有半个月了,这期间看了很多资料和别人的程序源码,也尝试了用delphi.C++.C#编写COM程序,个人感觉Delphi是最好上手的.C++的模版生成的代码太过复杂繁琐,大量使用 ...