博弈论(Nim游戏的扩展)

公平组合游戏ICG

若一个游戏满足:
1.由两名玩家交替行动;

2.在游戏进程的任意时刻,可以执行的合法行动与轮到哪名玩家无关;

3.不能行动的玩家判负;
则称该游戏为一个公平组合游戏。
NIM博弈属于公平组合游戏,但城建的棋类游戏,比如围棋,就不是公平组合游戏

必胜状态和必败状态

必胜状态,先手进行某一个操作,留给后手是一个必败状态时,对于先手来说是一个必胜状态。即先手可以走到某一个必败状态。
必败状态,先手无论如何操作,留给后手都是一个必胜状态时,对于先手来说是一个必败状态。即先手走不到任何一个必败状态。

  • 如果当前局面所有石堆的异或和(Nim和)为0,那么无论如何操作,当前玩家都处于必败态;如果当前局面是必败态,则无论如何操作,另一方总有必胜的策略。

  • 如果当前局面所有石堆的异或和(Nim和)不为0,那么当前玩家可以通过正确的策略使对手进入必败态,因此当前玩家处于必胜态。如果当前局面是必胜态,玩家可以通过正确操作将局面转化为必败态,从而保证胜利。

异或运算三个性质:
①任何数和 0做异或运算,结果仍然是原来的数
②任何数和其自身做异或运算,结果是 0
③异或运算满足交换律和结合律 

#include <bits/stdc++.h>
using namespace std;
using ll = long long;int main() {ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n; cin >> n;int res = 0;for(int i = 0; i < n; i++){int x; cin >> x;res^=x;}if(res) cout << "Yes\n";else cout <<"No\n";return 0;
}

台阶-Nim游戏

与经典Nim的区别

  • 在经典的Nim游戏中,石子堆是独立的,而在台阶-Nim中,台阶之间可能存在关联。例如,某个台阶上的石子数量可能会影响其他台阶的策略

 

 结论:

此时我们需要将奇数台阶看做一个经典的Nim游戏,如果先手时奇数台阶上的值的异或值为0,则先手必败,反之必胜。

证明:
先手时,如果奇数台阶异或非0,根据经典Nim游戏,先手总有一种方式使奇数台阶异或为0,于是先手留了奇数台阶异或为0的状态给后手,此时先手必赢。
于是轮到后手:
①当后手移动偶数台阶上的石子到奇数台阶上时,先手只需将对手移动的石子继续移到下一个台阶,这样奇数台阶的石子相当于没变,奇数异或和仍是非0于是留给后手的又是奇数台阶异或为0的状态
②当后手移动奇数台阶上的石子到偶数台阶上时,留给先手的奇数台阶异或非0,根据经典Nim游戏,先手总能找出一种方案使奇数台阶异或为0

因此无论后手如何移动,先手总能通过操作把奇数异或为0的情况留给后手,当奇数台阶全为0时,只留下偶数台阶上有石子。

因此如果先手时奇数台阶上的值的异或值为非0,则先手必胜,反之必败!

#include <bits/stdc++.h>
using namespace std;
using ll = long long;int main() {ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n; cin >> n;int res = 0;for(int i = 1; i <= n; i++){int x; cin >> x;if(i & 1)res^=x;}if(res) cout << "Yes\n";else cout <<"No\n";return 0;
}

 集合-Nim游戏:

1.Mex运算:
设S表示一个非负整数集合.定义mex(S)为求出不属于集合S的最小非负整数运算
例如:S={0,1,2,4},那么mes(S)=3;

2.SG函数

  • 对于一个游戏状态 x,SG函数值 SG(x)表示从该状态出发,所有可能的后续状态的SG值所能达到的“最小非负整数”(Mex)。
  • 具体来说,若从状态 x通过合法操作可以到达的所有状态的SG值分别为 SG(y1),SG(y2),.......,SG(yk)那么 SG(x)就是一个不在这些SG值集合中的最小非负整数。

SG函数的性质:类似于经典的Nim游戏

  • 必败态(Losing Position):对于某个状态 x,如果 SG(x)=0那么当前处于该状态的玩家将无法避免失败(即在对方采取最优策略的情况下无论如何都会输)。
  • 必胜态(Winning Position):对于某个状态 x,如果 SG(x)\,\, \, !=\, \, \, 0,那么当前处于该状态的玩家有策略可以使对手进入必败态。也就是先手一定会胜利。

递归计算:

例如s = [2,5],x = 10时递归得到

 

初始状态:
  • f[x] 是用来存储每个x的SG值的数组,初始时f[x]的所有值都被设置为-1(表示尚未计算过)。
  • x = 10 是我们要计算的状态,s = [2, 5] 是可供选择的石子数。
计算 sg(10) 的过程:
  1. 调用 sg(10)

    • 首先检查 f[10],因为f[10] = -1,说明还没有计算过,所以继续计算。
    • 初始化集合 S
  2. 遍历 s[i]

    • s[0] = 2
      • 因为 10 >= 2,所以我们递归调用 sg(10 - 2) = sg(8)
    • s[1] = 5
      • 因为 10 >= 5,所以我们递归调用 sg(10 - 5) = sg(5)
  3. 递归调用 sg(8)

    • 首先检查 f[8],因为f[8] = -1,所以继续计算。
    • 初始化集合 S
    • 遍历 s[i]
      • s[0] = 2
        • 因为 8 >= 2,所以我们递归调用 sg(8 - 2) = sg(6)
      • s[1] = 5
        • 因为 8 >= 5,所以我们递归调用 sg(8 - 5) = sg(3)
  4. 递归调用 sg(6)

    • 首先检查 f[6],因为f[6] = -1,所以继续计算。
    • 初始化集合 S
    • 遍历 s[i]
      • s[0] = 2
        • 因为 6 >= 2,所以我们递归调用 sg(6 - 2) = sg(4)
      • s[1] = 5
        • 因为 6 >= 5,所以我们递归调用 sg(6 - 5) = sg(1)
  5. 递归调用 sg(4)

    • 首先检查 f[4],因为f[4] = -1,所以继续计算。
    • 初始化集合 S
    • 遍历 s[i]
      • s[0] = 2
        • 因为 4 >= 2,所以我们递归调用 sg(4 - 2) = sg(2)
      • s[1] = 5
        • 因为 4 < 5,所以跳过。
  6. 递归调用 sg(2)

    • 首先检查 f[2],因为f[2] = -1,所以继续计算。
    • 初始化集合 S
    • 遍历 s[i]
      • s[0] = 2
        • 因为 2 >= 2,所以我们递归调用 sg(2 - 2) = sg(0)
      • s[1] = 5
        • 因为 2 < 5,所以跳过。
  7. 递归调用 sg(0)

    • sg(0)是一个基本情况,因为没有石子可以取走,故f[0] = 0,返回 0
  8. 接下来如上继续.....
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 110, M = 10010;
int n,m;
int s[N],f[M];//s存储的是可供选择的石子数, f存储的是所有可能情况的SG值
int sg(int x){if(f[x] != -1) return f[x]; // 如果x的SG值已经计算过,直接返回set<int> S;//S是一个有序集合,用来存储当前状态的所有可能的下一步的SG值// 循环每一次可以选择拿走的石头数for(int i = 0; i < m; i++){// 递归计算x减去s[i]后的状态的SG值,并插入到集合S中if(x >= s[i]) S.insert(sg(x - s[i]));}//找到不存在的最小自然数for(int i = 0; ; i++){if(!S.count(i)) return f[x] = i;}
}int main() {ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin >> m;for(int i = 0; i < m; i++) cin >> s[i];cin >> n;memset(f,-1,sizeof f);f[0] = 0; //当x为0的时候sg函数返回0// 类似于经典的Nim游戏int res = 0;while(n--){int x; cin >> x;res ^= sg(x);}if(res) cout << "Yes\n";else cout <<"No\n";return 0;
}

拆分-Nim游戏

相比于集合-Nim,这里的每一堆可以变成小于原来那堆的任意大小的两堆 

即a[i]可以拆分成(b[i],b[j]),为了避免重复规定b[i]>=b[j]即:a[i]>b[i]>=b[j]

相当于一个局面拆分成了两个局面,由SG函数理论,多个独立局面的SG值,等于这些局面SG值的异或和。SG(i^j) = SG(i) ^SG(j)

因此需要存储的状态就是sg(b[i])^sg(b[j]),与集合-Nim的唯一区别

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 110, M = 10010;
int n,m;
int s[N],f[M];//s存储的是可供选择的石子数, f存储的是所有可能情况的SG值
int sg(int x){if(f[x] != -1) return f[x]; // 如果x的SG值已经计算过,直接返回set<int> S;//这里可以改为unordered_set<int> S//S是一个有序集合,用来存储当前状态的所有可能的下一步的SG值for(int i = 0; i < x; i++){for(int j = 0; j <= i; j++){S.insert(sg(i) ^ sg(j));}}//找到不存在的最小自然数for(int i = 0; ; i++){if(!S.count(i)) return f[x] = i;}
}int main() {ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin >> n;memset(f,-1,sizeof f);f[0] = 0;// 类似于经典的Nim游戏int res = 0;while(n--){int x; cin >> x;res ^= sg(x);}if(res) puts("Yes");else puts("No");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/52531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大刀阔斧改革之后,阅文距离“东方迪士尼”更近了吗?

当前&#xff0c;网文IP的确是“富矿”。中国社会科学院文学研究所发布的《2023中国网络文学发展研究报告》显示&#xff0c;截至2023年底&#xff0c;网络文学IP市场规模2605亿元&#xff0c;同比增长近百亿元。 近日&#xff0c;网文产业中的头部企业阅文集团也披露数据称&a…

虚拟内存和linux(操作系统part1)

一个操作系统的虚拟内存和linux部分知识点的笔记整理&#xff0c;资料大多参考于&#xff1a;小林coding和Javaguide。 虚拟内存的作用 第一&#xff0c;虚拟内存可以使得进程运行内存超过物理内存大小&#xff0c;因为程序运行符合局部性原理&#xff0c;CPU 访问内存会有很…

【iOS安全】iPhone8 iOS14.4.2 越狱教程

环境配置 iPhone 8&#xff1a; 固件版本 iOS 14.4.2 (18D70) 产品类型 iPhone10,1 (A1906) 销售型号 MQ862J/A MacBook Pro&#xff1a; macOS 10.15.7 装有CheckRa1n beta 0.12.4 概述 尝试了几个版本的unc0ver和Taurine&#xff0c;发现都不好使 unc0ver显示unsupported…

95.SAP MII功能详解(08)Workbench-Transaction介绍

目录 1.Transaction 2.Properties of transaction 1.Transaction You use transactions to access data from multiple sources and execute processes, which are triggered synchronously or asynchronously.您可以使用事务从多个源访问数据并执行同步或异步触发的流程。…

代码随想录——两个字符串的删除操作(Leetcode 583)

题目链接 动态规划 思路&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j]&#xff1a;以i-1为结尾的字符串word1&#xff0c;和以j-1位结尾的字符串word2&#xff0c;想要达到相等&#xff0c;所需要删除元素的最少次数。 确定递推公式 当…

PD取电快充协议方案

PD快充协议是通过调整电压和电流来提供不同的充电功率。它采用了一种基于USB-C端口的通信协议&#xff0c;实现了充电器于设备之间的信息交换。在充电过程中设备会向充电器发出请求&#xff0c;要求提供不同的电压和电流&#xff0c;充电器接收到请求后&#xff0c;会根据设备的…

cordova手动更新

1&#xff1a;依赖 cordova-plugin-file cordova-plugin-file-transfer cordova-plugin-file-opener2 第二个参数&#xff1a;application/vnd.android.package-archive来源 cordova plugin add cordova-plugin-app-version//获取cordova版本号 cordova plugin add cordova-p…

Python | Leetcode Python题解之第375题猜数字大小II

题目&#xff1a; 题解&#xff1a; class Solution:def getMoneyAmount(self, n: int) -> int:f [[0] * (n 1) for _ in range(n 1)]for i in range(n - 1, 0, -1):for j in range(i 1, n 1):f[i][j] j f[i][j - 1]for k in range (i, j):f[i][j] min(f[i][j], k …

视频中间件:大华视频设备接入管理应用

前言 上篇博文介绍了视频中间件&#xff1a;海康视频设备的接入管理&#xff1f;&#xff0c;今天给大家带来大华视频设备的接入管理&#xff0c;视频中间件平台支持大华Sdk、大华主动注册、Onvif、Rtsp、Gb28181等方式对大华视频设备的接入管理。同时视频中间件可支持协议互转…

虚幻引擎(Unreal Engine)技术使得《黑神话悟空传》大火,现在重视C++的开始吃香了,JAVA,Go,Unity都不能和C++相媲美!

虚幻引擎&#xff08;Unreal Engine&#xff09;火了黑神话游戏。 往后&#xff0c;会有大批量的公司开始模仿这个赛道&#xff01; C 的虚拟引擎技术通常指的是使用 C 语言开发的游戏引擎&#xff0c;如虚幻引擎&#xff08;Unreal Engine&#xff09;等。以下是对 C 虚拟引…

数据库应用

一、数据库基本概念 1、数据 &#xff08;1&#xff09;描述事物的符号记录称为数据&#xff08;Data&#xff09;。数字、文字、图形、图像、声音、档案记录等 都是数据。 &#xff08;2&#xff09;数据是以“记录”的形式按照统一的格式进行存储的&#xff0c;而不是杂乱…

AI学习记录 - 怎么理解 torch 的 nn.Conv2d

有用就点个赞 怎么理解 nn.Conv2d 参数 conv_layer nn.Conv2d(in_channels3, out_channels 64, kernel_size3, stride1, padding0, biasFalse) in_channels in_channels 可以设置成1&#xff0c;2&#xff0c;3&#xff0c;4等等都可以&#xff0c;一般来说做图像识别的时…

SD-WAN组网部署需要多久?

企业在发展时&#xff0c;对能够快速响应需求、降低成本、提升网络性能与安全性的解决方案的需求日益迫切。SD-WAN作为一种创新的网络技术&#xff0c;正逐渐成为企业实现这一目标的关键工具。许多企业关心的问题是&#xff1a;部署SD-WAN需要多长时间&#xff1f;接下来我们将…

舍得酒业增长梦魇浮现:上半年业绩下挫,库存激增仍要扩产

撰稿|行星 来源|贝多财经 2024年&#xff0c;白酒行业仍处于“存量竞争”下的调整恢复期。而据中国酒业协会理事长宋书玉透露&#xff0c;今年上半年全国白酒产量、销售收入、利润分别同比增长3%、11%和15%&#xff0c;实现量、价、利齐升&#xff0c;展现出强大的韧性。 在市…

基于分布式计算的电商系统设计与实现【系统设计、模型预测、大屏设计、海量数据、Hadoop集群】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目展示项目介绍 目录摘要Abstract1 引言1.1 研究背景1.2 国内外研究现状1.3 研究目的1.4 研究意义 2 关键技术理论介绍2.1 Hadoop相关组件介绍2.2 分布式集群介绍2.3 Pyecharts介绍2.4 Fl…

CSS文本样式(一)

一、font-family 1、font-family属性 font-family​ &#xff1a;属性指定元素的​字体​&#xff0c;语法格式如下&#xff1a; ​font-family​: 字体1,字体2,...; 有两种字体系列名称&#xff1a; ​字体系列​&#xff1a;特定的字体系列&#xff08;如Times New Rom…

深度学习-批量与动量【Datawhale X 李宏毅苹果书 AI夏令营】

实际工程中使用批量和动量可以对抗鞍点或局部最小值。 批量&#xff1a; 在计算梯度的时候不会用所有数据计算损失。类比我们考试复习时&#xff0c;一个单元一个单元的知识点输入&#xff0c;所有单元都输入就是一整个轮回。而这一个单元用深度学习的术语来说就是批量&#x…

SpringBoot实现Word转PDF/TXT

背景 研发工作中难免会遇到一些奇奇怪怪的需求&#xff0c;就比如最近&#xff0c;客户提了个新需求&#xff1a;上传一个WORD文档&#xff0c;要求通过系统把该文档转换成PDF和TXT。客户的需求是没得商量的&#xff0c;必须实现&#xff01;承载着客户的期望&#xff0c;我开始…

postgresql底层Driver驱动包数据库是怎么连接,怎么发送数据,怎么设置超时

##一、建立连接 ##connectionFactory.openConnectionImpl ##底层也没什么神秘的&#xff0c;就是使用的socket通讯 ##连接&#xff0c;打开流 ##socket.connect ##获取到读写流 ##二、数据库连接池创建Connection连接 ##三、发送相关sql数据 ##发数据 ##发送查询 ##sendParse(q…

three.js渲染中文的3D字体

下载中文字体 引入下面的代码 点击下载 提取码: lywa <!DOCTYPE html> <html lang"en"><head><title>three.js webgl - modifier - tessellation</title><meta charset"utf-8"><meta name"viewport" c…