【博弈论】博弈论入门笔记(四类基础博弈结论+SG函数)
1.巴什博奕(Bash Game):
只有一堆n个物品,两个人轮流轮流从中取物,每次最少取一个,最多取m个,最后取光的人获胜。(谁拿了最后一个谁赢)
结论:
1.if(n%(m+1) != 0) ,则先手必赢
2.if(n%(m+1) == 0),则后手必赢
也就是给对手留下m+1个物品,这样的话,对手则处于必败态。
2.威佐夫博奕(Wythoff Game):
有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
结论:
1.(int)((bk-ak) * (1+√5)/2) != ak,先手必赢
2.(int)((bk-ak) * (1+√5)/2) == ak,后手必赢
POJ 1067
Code:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int a,b;
int main(){while(scanf("%d %d",&a,&b) != EOF){if(a >b) swap(a,b); if((int)((b-a) * (sqrt(5.0)+1)/2) == a){//注意此处sqrt()函数,将5.0改为5在POJ会有编译错误,因为函数原型中没有sqrt(int)cout<<"0\n"; // 后手赢 }elsecout<<"1\n"; // 先手赢}return 0;
3. 尼姆博弈:
有n堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
计算机算法里面有一种叫做异或的运算,我们用符号XOR表示这种运算。其运算规则为:如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
以(1,2,3)的异或运算:
1 =二进制01
2 =二进制10
3 =二进制11 (+)
———————
0 =二进制00 (注意不进位)
对于奇异局势(0,n,n)也一样,结果也是0。
任何奇异局势(a,b,c)都有a XOR b XOR c =0。
到此:
1.a1 XOR a2 XOR a3 …XOR an != 0 必胜态
2.a1 XOR a2 XOR a3 …XOR an == 0 必败态
性质:
1.必败态只能转移到必胜态
2.必胜态总能转移到某个必败态
POJ2234
Code:
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#define MAX
using namespace std;
int main(){int m,x;int arr[25];while(scanf("%d",&m) != EOF){x = 0;for(int i = 0 ; i <m ;i++){cin>>arr[i];x^=arr[i];}if(x == 0)cout<<"No\n";//必输态 else{cout<<"Yes\n";}}return 0;
}
4.斐波那契博弈:
有一堆个数为n的石子,游戏双方轮流取石子,满足:
1)先手不能在第一次把所有的石子取完;
2)之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍)。
约定取走最后一个石子的人为赢家。
结论:当n为Fibonacci数的时候,必败。
f[i]:1,2,3,5,8,13,21,34,55,89……
哈工大新生同步赛(小乐乐吃糖豆):https://ac.nowcoder.com/acm/contest/302/G
#include <iostream>
#include <cstdio>using namespace std;int fib[50];
int main(){fib[0]=1;fib[1]=2;for(int i=2;i<45;i++)fib[i]=fib[i-1]+fib[i-2];int n;while(scanf("%d",&n)!=EOF&&n){int i=0;for(i=0;i<45;i++)if(fib[i]==n)break;if(i<45)cout<<"Big\n";elsecout<<"Small\n";}return 0;
5.SG函数
SG 定理就是:SG(G)=SG(G1) ^ SG(G2) ^ … ^ SG(Gn)。也就是说,原游戏的SG函数值是它的所有子游戏的SG函数值的异或。
SG(G1) ^ SG(G2) ^ … ^ SG(Gn)>0的话 先手赢, 否则 后手赢
解题模型:
1.把原游戏分解成多个独立的子游戏,则原游戏的SG函数值是它的所有子游戏的SG函数值的异或。
即SG(G)=SG(G1)^SG(G2)^...^Sg(Gn)。
2.分别考虑每一个子游戏,计算其SG值。
SG值的计算方法:(重点)a.可选步数为1~m的连续整数,直接取模即可,SG(x) = x % (m+1)(Bash game)。b.可选步数为任意步,SG(x) = x(Nim game)。c.可选步数为一系列不连续的数,用模板计算。
打表模板:
int f[N],SG[MAXN],S[MAXN];//f[] - 可改变当前状态 的方式 S[] - 当前状态的后继状态集合
//打表
void getSG(int n) {int i,j;memset(SG,0,sizeof(SG));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; //S[]数组来保存当前状态的后继状态集合for(j = 0;; j++) if(!S[j]) {//模拟mex运算SG[i] = j;break;}}
}
HDOJ 1048
Code:
#include<iostream>
#include<cstring>
#include<algorithm>using namespace std;
const int maxn=1007;int f[maxn],sg[maxn],s[maxn],x;void getsg(int n){for(int i = 1; i <= n; i++) {memset(s,0,sizeof(s));// for(int j = 0; j <= 45 && i-f[j] >= 0; j++) {s[sg[i-f[j]]] = 1;}for(int j = 0 ; j <= 1000; j++) {if(!s[j]) {sg[i] = j;break;}}}
}int main(){f[0]=1;f[1]=1;for(int i=2;i<=45;i++){f[i]=f[i-1]+f[i-2];}getsg(1001);int n,m,p;while(scanf("%d%d%d",&n,&m,&p)&&(m||n||p)){if(sg[n]^sg[m]^sg[p]) cout<<"Fibo\n";else cout<<"Nacci\n";}return 0;
}
转载博客
【博弈论】博弈论入门笔记(四类基础博弈结论+SG函数)相关推荐
- 【博弈论】博弈论入门笔记(四类基础博弈+SG函数)
『博弈论定义』 博弈论又被称为对策论(Game Theory):是二人或多人在平等的对局中各自利用对方的策略变换自己的对抗策略,达到取胜目标的理论.博弈论是研究互动决策的理论.博弈可以分析自己与对手的 ...
- [Java入门笔记] 面向对象编程基础(二):方法详解
2019独角兽企业重金招聘Python工程师标准>>> 什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能 ...
- 大数据HiveSQL学习笔记三-查询基础语法以及常用函数
大数据HiveSQL学习笔记三-查询基础语法以及常用函数 一.基础语法 1.SELECT -列名- FROM -表名- WHERE -筛选条件- 如:需要根据城市,性别找出匹配的10个用户 user_ ...
- SQL Server 2008空间数据应用系列四:基础空间对象与函数应用
SQL Server 2008空间数据应用系列四:基础空间对象与函数应用 原文:SQL Server 2008空间数据应用系列四:基础空间对象与函数应用 友情提示,您阅读本篇博文的先决条件如下: 1. ...
- 博弈论(Bash博弈、Nim博弈、SG函数、组合博弈)
组合博弈入门 一.博弈论三条性质: 终结点为P点 P点只能到N点 N点至少有一种途径到P点 N:必胜态 P:必败态 1.引导题 1846 Brave Game 题目大意: n个石子两人轮流取1~ ...
- 机器学习入门 笔记(二) 机器学习基础概念
第二章 机器学习基础概念 1.机器的数据 2.机器学习的主要任务 3.监督学习和非监督学习 4.批量.在线学习.参数.非参数学习 5.哲学思考 6.环境的搭建 1.机器的数据 我们以鸢尾花的数据为例. ...
- React一天入门笔记(一) | 基础知识点
React基础知识点 目标 能够说出React是什么 能够说出React的特点 能够掌握React的基本使用 能够使用React脚手架 什么是React (★★★) React是一个用于构建用户界面的 ...
- java实型常量用十六进制表示_[Java入门笔记] Java语言基础(二):常量、变量与数据类型...
常量与变量 什么是常量和变量 常量与变量都是程序在运行时用来存储数据一块内存空间 常量: 常量的值在程序运行时不能被改变,Java中声明常量必须使用final关键字.常量还可以分为两种意思: 第1种意 ...
- [Java入门笔记] Java语言基础(二):常量、变量与数据类型
2019独角兽企业重金招聘Python工程师标准>>> 常量与变量 什么是常量和变量 常量与变量都是程序在运行时用来存储数据一块内存空间 常量: 常量的值在程序运行时不能被改变,Ja ...
最新文章
- 带哨兵节点的链_【算法导论】10.2不带哨兵节点和带哨兵节点的双向链表
- docker安装、启动mongo
- 01XC-1: 动态规划
- ArcGIS实验教程——实验三十一:ArcGIS构建泰森多边形(Thiessen Polygon)实例精解
- 安装redis提示[test] error 2_安装PHP Redis扩展
- 初中计算机教案小学,初中8年级信息技术教案
- 20140704笔试面试总结(java)
- python爬虫什么意思-Python爬虫可以做什么?
- Servlet自动刷新页面
- 颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别?计算机颜色格式( 8位 16位 24位 32位色)【转】...
- 不一样的设计!20个国外优秀的电子商务网站
- 论文精读 清华ERNIE:Enhanced Language Representation with Informative Entities
- 2023 年(MCM/ICM)美国大学生数学建模竞赛参赛规则及注意事项
- 性能测试培训:性能瓶颈分析思路
- 我的世界服务器如何修复报错,我的世界18w30a发布 修复1.13众多BUG
- 2017物联网蓬勃发展,看各领域巨头如何抢先机占山头
- 30 个 Python 的最佳实践、小贴士和技巧
- IDM UEStudio 19中文版
- 「奋斗者协议」又来了:自愿加班、接受淘汰、不与公司发生法律纠纷
- 王兴是怎么看待共享单车这块业务的
热门文章
- UbuntuKyilin 13.04为何不敢走出国门?
- python题目总结2
- 周记-20210110
- 火狐 安装 RESTED 插件
- Python获取、格式化当前时间日期的方法
- 协方差Covariance 相关系数correlation coefficient 和 方差-协方差矩阵variance-covariance matrix
- 41岁中兴员工:这可能是我第5次失业
- android定制系统横评,专属定制 Win系统下的Android系统_酷比魔方 i7酷睿M_平板电脑评测-中关村在线...
- xml中[CDATA[]]浅解
- 刀锋铁骑服务器维护,刀锋铁骑 - 服务退换中心 - 腾讯游戏