博弈论之SG函数
来源:互联网 发布:debian和ubuntu区别 编辑:程序博客网 时间:2024/05/14 02:29
SG函数
首先定义一个基于集合的运算mex{a1,a2,a3....},运算的结果为集合的整数补集中的最小自然数。
对于一个给定的有向无环图,定义关于图的每个顶点的Sprague-Grundy函数g如下:
g(x)=mex{ g(y) | y是x的后继 }。
例:当前有n个石子,每次能取得石子集合为f[]={1,2,3}。
sg[0]=0;
sg[1]=mex{sg(1-f[1])}=1;
sg[2]=mex{sg(2-f[1]),sg(2-f[2])}=2;
sg[3]=mex{sg(3-f[1]),sg(3-f[2]),sg(3-f[3])}=mex{sg(2),sg(1),sg(0)}=3;
sg[4]=mex{sg(4-f[1]),sg(4-f[2]),sg(4-f[3])}=mex{sg(3),sg(2),sg(1)}=0;
............
SG函数模板1
<pre name="code" class="cpp"><pre name="code" class="cpp"> //f[]:可以取走的石子个数//sg[]:0~n的SG函数值//hash[]:mex{}int f[N],sg[N],hash[N]; void getSG(int n){ int i,j; memset(sg,0,sizeof(sg)); for(i=1;i<=n;i++) { memset(hash,0,sizeof(hash)); for(j=1;f[j]<=i;j++) hash[sg[i-f[j]]]=1; for(j=0;j<=n;j++){ //求mes{}中未出现的最小的非负整数 if(hash[j]==0){ sg[i]=j; break; } } }}
模板2
//注意 S数组要按从小到大排序 SG函数要初始化为-1 对于每个集合只需初始化1遍//n是集合s的大小 S[i]是定义的特殊取法规则的数组int s[110],sg[10010],n;int SG_dfs(int x){ int i; if(sg[x]!=-1) return sg[x]; bool vis[110]; memset(vis,0,sizeof(vis)); for(i=0;i<n;i++) { if(x>=s[i]) { SG_dfs(x-s[i]); vis[sg[x-s[i]]]=1; } } int e; for(i=0;;i++) if(!vis[i]) { e=i; break; } return sg[x]=e;}
0 0
- 博弈论之sg函数
- 博弈论之SG函数
- 博弈论之sg函数
- 博弈论之NIM游戏与SG函数
- HDU_1536 博弈论-sg函数
- SG函数(博弈论)
- 博弈论中的SG函数
- 博弈论 (SG函数)
- 博弈论与SG函数
- 博弈论 随记(SG函数)
- 博弈论 SG函数
- 博弈论(sg函数)
- 博弈论 SG函数
- 博弈论SG函数
- 博弈论 sg函数
- 博弈论 SG函数模板
- 博弈论 SG函数
- SG 函数,博弈论
- 最佳调度问题 解题报告
- Ubuntu 12.04 root用户登录设置
- 程序能正常下载,但是无法执行,卡在NVIC_Configuration
- query插件中(function ( $, window, document, undefined )的作用
- System.Data.SqlClient.SqlException (0x80131904): Timeout 时间已到
- 博弈论之SG函数
- 复制class文件到as中出现非法字符,需要class,interface货enum
- 121. Best Time to Buy and Sell Stock
- 前端拼接数组
- 图片验证码的生成和验证
- 与web相关的bean作用域
- Android之drawable state各个属性详解
- A题之养兔子
- 删除openfire,彻底卸载