博弈论——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的更多相关文章

  1. [poj2311]Cutting Game_博弈论

    Cutting Game poj-2311 题目大意:题目链接 注释:略. 想法: 我们发现一次操作就是将这个ICG对应游戏图上的一枚棋子变成两枚. 又因为SG定理的存在,记忆化搜索即可. 最后,附上 ...

  2. POJ2311 Cutting Game 博弈 SG函数

    Cutting Game Description Urej loves to play various types of dull games. He usually asks other peopl ...

  3. POJ2311 Cutting Game

    题意 Language:Default Cutting Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6007 Acc ...

  4. POJ2311 Cutting Game(博弈论)

    总时间限制: 1000ms 内存限制: 65536kB 描述 Urej loves to play various types of dull games. He usually asks other ...

  5. 【博弈论】【SG函数】poj2311 Cutting Game

    由于异或运算满足结合律,我们把当前状态的SG函数定义为 它所能切割成的所有纸片对的两两异或和之外的最小非负整数. #include<cstdio> #include<set> ...

  6. SG函数博弈——poj2311

    关于SG函数的博弈 首先定义必败态 x : SG[x]=0 设任意一个状态y,到所有y能到达的状态连一条边,令这些后继为z y : SG[y]=mex(SG[z]) SG[y]==0 : y就是必败态 ...

  7. $POJ2311\ Cutting\ Game$ 博弈论

    正解:博弈论 解题报告: 传送门! 首先看到说,谁先$balabala$,因为$SG$函数是无法解决这类问题的,于是考虑转化成"不能操作者赢/输"的问题,不难想到先剪出$1\cdo ...

  8. 博弈问题之SG函数博弈小结

    SG函数: 给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移 动者判负.事实上,这个游戏可以认为是所有Impartial Combinatorial Ga ...

  9. ACM学习大纲

    1 推荐题库 •http://ace.delos.com/usaco/ 美国的OI 题库,如果是刚入门的新手,可以尝试先把它刷通,能够学到几乎全部的基础算法极其优化,全部的题解及标程还有题目翻译可以b ...

随机推荐

  1. Instruments性能检测

    关于Instruments有网友如是说的:"一句话: 内存开销.运行速度.内存泄露 and so on". 如此简单的回答肯定打发不了咱们各位看官和面试官,当然上述表达和下边的网友 ...

  2. java list 去除 重复值

    一: Hastset根据hashcode判断是否重复,数据不会重复 Java代码 /** List order not maintained **/ public static void remove ...

  3. Ubuntu密码忘记了怎么办(转载)

    版本:Ubuntu 11.10 思路是进入root中,然后使用passwd修改自己的密码. 假设用户名:quietheart 经过网上查询,如果安装系统之后没有设root密码,那么,Ubuntu 11 ...

  4. 页面类跳转Demo

    package baidumapsdk.demo; import android.app.Activity; import android.content.BroadcastReceiver; imp ...

  5. block 的调用 简单代码

    #import <Foundation/Foundation.h> #import "Button.h" typedef int (^MySum) (int, int) ...

  6. MVC自学第三课

    上一课我们已经能够做出简单的HTML显示页面,并懂得了MVC的工作模式,这一课我们讲解一些动态的数据交互. 在MVC中,控制器的工作是构造某些数据,而视图的工作是把它渲染成HTML.数据是从控制器传递 ...

  7. Linux 分区初始化为物理卷,把物理卷加入卷组

    用到的命令有 1.pvcreate (physical volume create) 2.vgcreate (volume group create) 例子1:创建物理卷 pvcreate /dev/ ...

  8. SQL Server 启用与禁止触发器

    启用: disable trigger trigger_name on {objectName | database_name | server}; 禁用: enable trigger trigge ...

  9. VPN的分类方式

    VPN的分类方式    VPN的分类方式比较混乱.不同的生产厂家在销售它们的VPN产品时使用了不同的分类方式,它们主要是产品的角度来划分的.不同的ISP在开展VPN业务时也推出了不同的分类方式,他们主 ...

  10. [Leetcode][Python]30: Substring with Concatenation of All Words

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 30: Substring with Concatenation of All ...