SG函数学习
尼姆博弈就是sg函数的简单体现
学习粗:https://blog.csdn.net/luomingjun12315/article/details/45555495
//f[N]:可改变当前状态的方式,N为方式的种类,f[N]要在getSG之前先预处理
//SG[]:0~n的SG函数值
//S[]:为x后继状态的集合
int f[N],SG[MAXN],S[MAXN];
void getSG(int n){
int i,j;
memset(SG,0,sizeof(SG));
//因为SG[0]始终等于0,所以i从1开始
for(i = 1; i <= n; i++){
//每一次都要将上一状态 的 后继集合 重置
memset(S,0,sizeof(S));
for(j = 0; f[j] <= i && j <= N; j++)
S[SG[i-f[j]]] = 1; //将后继状态的SG函数值进行标记
for(j = 0;; j++) if(!S[j]){ //查询当前后继状态SG值中最小的非零值
SG[i] = j;
break;
}
} }
题:http://acm.hdu.edu.cn/showproblem.php?pid=1536
分析,对石子堆打表出sg函数
异或和要求只能去的数
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=;
int s[],sg[N+],f[];
void getsg(int n){
sg[]=;
for(int i=;i<N;i++){
memset(s,,sizeof(s));
for(int j=;f[j]<=i&&j<=n;j++){
s[sg[i-f[j]]]=;
}
for(int j=;j<N;j++){
if(!s[j]){
sg[i]=j;
break;
}
}
}
}
int main(){
int k;
while(scanf("%d",&k)!=EOF){
if(k==)
break;
for(int i=;i<=k;i++)
scanf("%d",&f[i]);
sort(f+,f++k);
getsg(k);
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
int ans=;
for(int x,i=;i<=n;i++){
scanf("%d",&x);
ans^=sg[x];
}
if(ans)
printf("W");
else
printf("L"); } printf("\n");
}
return ;
}
题:http://acm.hdu.edu.cn/showproblem.php?pid=5724
由状压得来的sg函数。
题意:n*20的棋盘,给你n行,每行m个,每位选手把棋子移到右边第一个空的位置,移不动则输,问先手是否必赢
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back
const int M=1e3+;
int sg[<<];
int sta[];
void init(){ for(int i=;i<(<<);i++){
memset(sta,,sizeof(sta));
for(int j=;j>=;j--)
if(i&(<<j)){
for(int k=j-;k>=;k--){
if(!(i&(<<k))){
sta[sg[i^(<<k)^(<<j)]]=;
break;
}
}
} for(int j=;j<=;j++)
if(sta[j]==){
sg[i]=j;
break;
}
}
}
int main(){
init();
int t;
scanf("%d",&t);
while(t--){
int n;
int ans=;
scanf("%d",&n);
for(int i=;i<=n;i++){
int m;
int sign=;
scanf("%d",&m);
while(m--){
int x;
scanf("%d",&x);
sign|=<<(-x);
}
ans^=sg[sign]; }
if(ans)
puts("YES");
else
puts("NO");
}
return ;
}
SG函数学习的更多相关文章
- SG函数学习总结
有点散乱, 将就着看吧. 首先是博弈论的基础, 即 N 和 P 两种状态: N 为必胜状态, P 为必败状态. 对于N, P两种状态, 则有 1. 没有任何合法操作的状态, P; 2. 可以移动到P局 ...
- SG 函数学习
\(Mex\) 运算 \(mex(S)\) 为不属于集合 \(S\) 的最小非负整数,即: \[mex(S)=\min \limits_{x \in \mathbb{N},x \not\in S} \ ...
- 学习笔记--博弈组合-SG函数
fye学姐的测试唯一的水题.... SG函数是一种游戏图每个节点的评估函数 具体定义为: mex(minimal excludant)是定义在整数集合上的操作.它的自变量是任意整数集合,函数值是不属于 ...
- HDU 1536 sg函数
S-Nim Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- hdu-------(1848)Fibonacci again and again(sg函数版的尼姆博弈)
Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- 【转】博弈问题及SG函数(真的很经典)
博弈问题若你想仔细学习博弈论,我强烈推荐加利福尼亚大学的Thomas S. Ferguson教授精心撰写并免费提供的这份教材,它使我受益太多.(如果你的英文水平不足以阅读它,我只能说,恐怕你还没到需要 ...
- (转)博弈问题与SG函数
博弈问题若你想仔细学习博弈论,我强烈推荐加利福尼亚大学的Thomas S. Ferguson教授精心撰写并免费提供的这份教材,它使我受益太多.(如果你的英文水平不足以阅读它,我只能说,恐怕你还没到需要 ...
- 博弈论进阶之SG函数
SG函数 个人理解:SG函数是人们在研究博弈论的道路上迈出的重要一步,它把许多杂乱无章的博弈游戏通过某种规则结合在了一起,使得一类普遍的博弈问题得到了解决. 从SG函数开始,我们不再是单纯的同过找规律 ...
- 博弈论初步(SG函数)
讲解见此博客https://blog.csdn.net/strangedbly/article/details/51137432 理解Nim博弈,基于Nim博弈理解SG函数的含义和作用. 学习求解SG ...
随机推荐
- MFC 打开Jpg文件
UpdateWindow(); int height, width; CRect rect;//定义矩形类 CRect rect1; CImage image; //创建图片类 image.Load( ...
- 洛谷 P1020 导弹拦截
题目传送门 解题思路: 其实就是求一遍最长不上升子序列和最长上升子序列 AC代码: #include<iostream> #include<cstdio> #include&l ...
- ComboPooledDataSource连接mysql
Dbutils学习(介绍和入门) 一:Dbutils是什么?(当我们很难理解一个东西的官方解释的时候,就让我们记住它的作用) Dbutils:主要是封装了JDBC的代码,简化dao层 ...
- 利用mysecureshell搭建sftp服务
1.下载对应的mysecureshell-1.33-1.x86_64.rpm包 2.安装mysecureshell-1.33-1.x86_64.rpm 3.添加ftp用户 useradd ftp 4. ...
- centos socket通信时 connect refused 主要是防火墙问题
centos socket通信时 connect refused 主要是防火墙问题,可以关闭防火墙,或者开放程序中的端口
- .NET CORE 获取微信支付回调
1.获取微信支付的回调的数据 Stream stream = HttpContext.Request.Body; byte[] buffer = new byte[HttpContext.Reques ...
- Java 过滤器Filter,Java Filter 不拦截某些请求 Java 过滤器支持Ajax请求
================================ ©Copyright 蕃薯耀 2020-01-10 https://www.cnblogs.com/fanshuyao/ 一.Java ...
- java笔记5
1. JUnit 单元测试:方法名任意,但是没有参数列表. 注解: @Test @Ignore @Before @After 2. 泛型 1. 在集合中使用泛型 2. 在通用性较高的代码中使用泛型 1 ...
- Spring中的控制反转和依赖注入
Spring中的控制反转和依赖注入 原文链接:https://www.cnblogs.com/xxzhuang/p/5948902.html 我们回顾一下计算机的发展史,从最初第一台计算机的占地面积达 ...
- (转载)JVM中的内存模型与垃圾回收
转载自微信公众号:Java高级架构(Java-jiagou)-----看完这篇文章,我奶奶都知道JVM中的内存模型与垃圾回收了! 六.内存模型 6.1 内存模型与运行时数据区 Java虚拟机在执行J ...