当前位置: 首页 > news >正文

[python刷题模板] 博弈入门-记忆化搜索/dp/打表

[python刷题模板] 博弈入门-记忆化搜索/dp/打表

    • 一、 算法&数据结构
      • 1. 描述
      • 2. 复杂度分析
      • 3. 常见应用
      • 4. 常用优化
    • 二、 模板代码
      • 1. 打表贪心的博弈
      • 2. 464. 我能赢吗
      • 3. Nim游戏--最最基础版n=1。
    • 三、其他
    • 四、更多例题
    • 五、参考链接

一、 算法&数据结构

1. 描述

博弈一直没怎么学,每次遇到了就看看题解,这两周被atc和牛客军训了,还都没做出来,思考了一下,暂且记录我粗浅的认知。
如果我未来能好好学学,可能回来更新。
  • 第一次做博弈可能是在LC,做了几道题发现基本上都可以用记忆化搜索来枚举局面。就记住了这个做法:
    • 记忆化搜索式做法,复杂度和局面状态数有关。
    • 注意,我们不管当前的人是谁,只要这个人遇到了这个局面,计算他在最优选择下是否能赢,就是必胜态。
    • 必胜的条件是,选完后,下个人是必败态;那么当前人的操作中,只要有一个必败态,当前就是必胜态。(因为当前人可以选择这个使下个人必败的操作。)
    • 而只有无论怎么操作,下个人都是必胜时,当前才是必败。因此有以下代码方式,(状态有俩参数):
      @lru_cache(None)
      def dfs(m, n):if xxd递归出口:return False/Truefor i in range(1, (m + 1) // 2):  # 枚举所有选择if not dfs(i, n):   # 注意这个not,后继态必败,当前必胜return True		   return False
      
  • dfs方式的问题是当状态太多或选择太多,复杂度不一定能过。这时就要想想,能不能有贪心策略了。
    • 但贪心又不是很简单能想出来的,那么请果断写个dfs,然后打表!找规律!

2. 复杂度分析

  1. dfs方式,具体分析,一般取决于状态数和转移方式。
  2. 贪心打表方式:不一定。

3. 常见应用

  1. 基础的博弈题。

4. 常用优化

  1. 注意牛客的装饰器必须加括号:@lru_cache(None)。

二、 模板代码

1. 打表贪心的博弈

例题: 小d的博弈

  • 具体题解可以见我这场比赛的题解。
# Problem: 小d的博弈
# Contest: NowCoder
# URL: https://ac.nowcoder.com/acm/contest/53366/E
# Memory Limit: 524288 MB
# Time Limit: 2000 msimport sys
from functools import lru_cacheRI = lambda: map(int, sys.stdin.buffer.readline().split())
RS = lambda: map(bytes.decode, sys.stdin.buffer.readline().strip().split())
RILST = lambda: list(RI())
DEBUG = lambda *x: sys.stderr.write(f'{str(x)}\n')MOD = 10 ** 9 + 7
PROBLEM = """
"""@lru_cache(None)
def dfs(m, n):if m <= 2 and n <= 2:return Falseif m <= 2 or n <= 2:return Truefor i in range(1, (m + 1) // 2):if not dfs(i, n):return Truefor j in range(1, (n + 1) // 2):if not dfs(m, j):return Truereturn False#     603  ms
def solve1():n, m = RI()y = x = 0while n > 2:n = (n - 1) // 2x += 1while m > 2:m = (m - 1) // 2y += 1if x != y:print('Alice')else:print('Bob')#   573    ms
def solve():n, m = RI()if (n + 1).bit_length() != (m + 1).bit_length():print('Alice')else:print('Bob')if __name__ == '__main__':t, = RI()for _ in range(t):solve()# for i in range(1, 40):#     for j in range(1, 40):#         print('X' if dfs(i, j) else 'O', end=' ')#     print()

2. 464. 我能赢吗

链接: 464. 我能赢吗

  • 第一步加个贪心判断,然后dfs
class Solution:def canIWin(self, maxChoosableInteger: int, desiredTotal: int) -> bool:@cachedef dfs(used_numbers,total):for i in range(maxChoosableInteger):if (used_numbers>>i)&1 == 0:  # used_numbers第i位是0,即i未被使用,他可以用if total + i +1 >= desiredTotal:return Trueif dfs(used_numbers|(1<<i),total+i+1) == False:  # 下一步的操作者,即下一个人输掉return Truereturn Falsereturn (1+maxChoosableInteger)*maxChoosableInteger//2 >= desiredTotal and dfs(0,0)

3. Nim游戏–最最基础版n=1。

链接: 292. Nim 游戏

  • nim游戏应该算一个小类别了,可以有n堆石子,每次也不一定让取多少个石子。
  • 我准备单开一个页面写nim游戏的sg函数。
  • 这题由于只有一堆,策略就非常简单,每次完剩余数字应该是4的倍数,这样对方一定拿不完,而我可以一步到同样的状态。对上下界的和取模即可。
class Solution:def canWinNim(self, n: int) -> bool:return bool(n%4)

三、其他

四、更多例题

五、参考链接

  • 链接: 【agKc/ACM】ABC297G P2197 |基础博弈论|SG函数|SG定理

相关文章:

[python刷题模板] 博弈入门-记忆化搜索/dp/打表

[python刷题模板] 博弈入门-记忆化搜索/dp/打表 一、 算法&数据结构1. 描述2. 复杂度分析3. 常见应用4. 常用优化二、 模板代码1. 打表贪心的博弈2. 464. 我能赢吗3. Nim游戏--最最基础版n1。三、其他四、更多例题五、参考链接一、 算法&数据结构 1. 描述 博弈一直没…...

I2C通信

一、理论上了解I2C时序 I2C写数据时序如图&#xff1a; 通过解析器解析I2C通信如上图&#xff08;SCL和SDA反了&#xff09;。 1---起始信号 2、3---应答信号ACK 5---停止信号 起始信号&#xff1a;SCL线是高电平时&#xff0c;SDA线从高电平向低电平切换。 停…...

【Linux】man什么都搜不了,No manual entry for xxx的解决方案

本文首发于 慕雪的寒舍 man什么都搜不了&#xff0c;No manual entry for xxx的解决方案 系统 CentOS 7.6 1.问题描述 今天查手册的时候&#xff0c;发现man什么都查不了。不管是系统接口还是函数&#xff0c;都显示没有入口文档&#xff08;No manual entry for&#xff09;…...

STM32 库函数 GPIO_SetBits、GPIO_ResetBits、GPIO_WriteBit、GPIO_Write 区别

问题&#xff1a;当我使用STM32库函数对 I/O 口进行赋值时&#xff0c;在头文件中发现有四个相关的函数可以做这个操作&#xff0c;那么它们有什么区别呢&#xff1f; 一、GPIO_SetBits //eg: GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);解释&#xff1a;置位(置1)选择的数…...

在 RISC-V Linux 内核中添加模块

在 RISC-V Linux 内核中添加模块 flyfish 本例以添加helloworld字符设备为例 一 源码配置 1 源码 源码文件helloworld.c拷贝到 drivers/char 目录中 源码主要是输出Hello world init 2 Kconfig 打开drivers/char 目录下的Kconfig文件 在endmenu之前加上 config HELLO…...

利用AOP实现统一功能处理

目录 一、实现用户登录校验 实现自定义拦截器 将自定义的拦截器添加到框架的配置中&#xff0c;并且设置拦截的规则 二、实现统一异常处理 三、实现统一数据格式封装 一、实现用户登录校验 在之前的项目中&#xff0c;在需要验证用户登录的部分&#xff0c;每次都需要利…...

会话技巧---英文单词

目录 前言原文表示同意、答应表示不同意表示建议与忠告鼓励称赞担心与忧虑赞美夸奖-单词前言 加油 原文 表示同意、答应 1.agree[əˈgri]vi. 同意(=approve of); 答应(= consent to) agreement [əˈgrimənt] n. (意见或看法)一致 agree with sb about / on sth…...

VS中解决方案和项目的区别

总目录 文章目录总目录一、概述1、解决方案2、项目3、项目文件4、解决方案文件夹二、图解1、图解解决方案和项目的关系2、图解sln文件3、图解项目文件结语一、概述 1、解决方案 解决方案是一个容器&#xff0c;通常包含多个项目&#xff0c;这些项目通常相互引用。 解决方案中…...

MyBatis的parameterType传入参数类型和resultType返回结果类型

记录&#xff1a;413 场景&#xff1a;MyBatis的parameterType传入参数类型和resultType返回结果类型。 版本&#xff1a;JDK 1.8,Spring Boot 2.6.3,mybatis-3.5.9。 1.传入参数parameterType是Integer 传入参数类型parameterType&#xff1a;java.lang.Integer。 返回结…...

什么是Android FrameWork,请你介绍一下?

Framework是什么 Framework的中文意思是“框架”&#xff0c;在软件开发中通常指开发框架&#xff0c;在一个系统中处于内核层之上&#xff0c;为顶层应用提供接口&#xff0c;被设计用来帮助开发者快速开发顶层应用&#xff0c;而不必关心系统内核运行机制&#xff0c;通常Fr…...

【SQL 必知必会】- 第十六课 更新和删除数据

目录 更新数据 不要省略WHERE 子句 在UPDATE 语句中使用子查询 删除数据 不要省略WHERE 子句 友好的外键 删除表的内容而不是表 更快的删除 更新和删除的指导原则 这一课介绍如何利用UPDATE 和DELETE 语句进一步操作表数据。 更新数据 更新&#xff08;修改&#xff09;表中…...

常见哈希算法及其应用

哈希算法经常会被用到&#xff0c;比如我们Go里面的map&#xff0c;Java的HashMap&#xff0c;目前最流行的缓存Redis都大量用到了哈希算法。它们支持把很多类型的数据进行哈希计算&#xff0c;我们实际使用的时候并不用考虑哈希算法的实现。而其实不同的数据类型&#xff0c;所…...

PHP快速入门02-PHP语言基础

文章目录前言一、 数据类型1.1 String&#xff08;字符串&#xff09;1.2 Integer&#xff08;整型&#xff09;1.3 Float&#xff08;浮点型&#xff09;1.4 Boolean&#xff08;布尔型&#xff09;1.5 Array&#xff08;数组&#xff09;1.6 Object&#xff08;对象&#xff…...

FSCapture - 长截图工具

FSCapture - 长截图工具前言下载使用推荐设置长截图前言 目前大部分手机系统都自带长截图功能&#xff0c;但Windows系统没有自带的长截图功能&#xff0c;因此推荐一款第三方工具FSCapture&#xff0c;该软件轻量强大&#xff0c;支持长截图&#xff0c;即滚动截图。 下载 …...

[ 云计算 | Azure ] Chapter 05 | 核心体系结构之管理组、订阅、资源和资源组以及层次关系

本文主要对如下内容进行讲解&#xff1a;Azure云计算的核心体系结构组件中的&#xff1a;资源、订阅和资源组&#xff0c;以及了解 Azure 资源管理器 (ARM) 如何部署资源。 本系列已经更新文章列表&#xff1a; [ 云计算 | Azure ] Chapter 03 | 描述云计算运营中的 CapEx 与…...

【算法LearnNO.1】算法介绍以及算法的时间复杂度和空间复杂度

目录 一、算法 1、算法概述 2、算法的5个特性 3、设计算法的标准 二、时间复杂度 1、时间复杂度的介绍 2、渐进时间复杂度的求法 3、计算时间复杂度的代码举例&#xff08;平方阶示例&#xff09; 4、时间复杂度排序 三、空间复杂度 一、算法 1、算法概述 算法就是解…...

013:Mapbox GL添加marker

第013个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中添加marker。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共70行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:https://xiaozhu…...

智慧工厂可视化合集,推动行业数字化转型

图扑软件基于 HTML5&#xff08;Canvas/WebGL/WebVR&#xff09;标准的 Web 技术&#xff0c;满足了工业物联网跨平台云端化部署实施的需求&#xff0c;以低代码的形式自由构建三维数字孪生、大屏可视化、工业组态等等。从 SDK 组件库&#xff0c;到 2D 和 3D 编辑&#xff0c;…...

工作流调度系统 Azkaban介绍与安装(一)

文章目录前言1、为什么要用工作流调度系统2、常见的工作流调度系统1 集群规划2 配置 MySQL3 配置 Executor Server3.1 修改 azkaban.properties3.2 启动3.3 激活4 配置 Web Server4.1 修改 azkaban.properties4.2 修改azkaban-users.xml文件&#xff0c;添加 atguigu 用户4.3 启…...

【Python基础入门学习】Python工具Pycharm的安装与使用

一、关于Python 1.1 下载Python 在下载与安装pycharm工具前&#xff0c;一定要先安装python 打开Python官网&#xff1a;python下载打开上述网站&#xff0c;选择 Downloads -> 系统 我是Windows系统&#xff0c;点击进入后&#xff0c;找到自己要安装的安装包以及想安装的…...

【版本控制】Github同步Gitee镜像仓库自动化脚本

文章目录Github同步Gitee镜像仓库自动化脚本前言什么是Hub Mirror Action&#xff1f;1.介绍2.用法配置步骤1.生成密钥对2.GitHub私钥配置3.Gitee公钥配置4.Gitee生成私人令牌5.Github绑定Gitee令牌6.编写CI脚本7.多仓库同步推送8.定时运行脚本总结Github同步Gitee镜像仓库自动…...

索引的分类

1.唯一索引 给表中某一列设置为了唯一约束(这列不允许出现重复数据)后&#xff0c;数据库会为将这一列设置索引&#xff0c;这个索引叫做唯一索引&#xff08;主键那一列是一个特殊的唯一索引&#xff0c;不仅要满足唯一索引这一列不可以出现重复数据&#xff0c;而且这一列还…...

【整理九】

目录1.说说你对递归的理解&#xff1f;封装一个方法用递归实现树形结构封装2.Link和import有什么区别&#xff1f;3.什么是FOUC? 如何避免&#xff1f;4.说说你对预编译器的理解&#xff1f;5.shouldComponentUpdate 的作用6.概述下 React 中的事务处理逻辑7.React组件的划分业…...

钢网是SMT生产使用的一种工具,如何制作?

钢网是SMT生产使用的一种工具&#xff0c;其主要功能是将锡膏准确地涂敷在有需要焊接的PCB焊盘上。 钢网的好坏&#xff0c;直接影响印刷工作的质量&#xff0c;目前一般使用的金属钢网&#xff0c;是由薄薄的、带有小孔的金属板制作成的&#xff0c;在开孔处&#xff0c;锡膏…...

如何创建自己的gym环境

我们为什么要创建一个gym的环境呢&#xff1f;因为需要&#xff0c;哈哈哈&#xff0c;这是一句废话&#xff0c;但是也是一句真话。因为我不想自己写强化学习的算法了&#xff0c;我想用一些现成的框架&#xff0c;这些框架训练的都是gym的游戏&#xff0c;那我把我自己想要训…...

使用Marshaller 将Java对象转化为XML格式和字符串转为xml

使用Marshaller 将Java对象转化为XML格式 对象转xml内容 ①工具类 public static String convertObjectToXml(Object obj) throws Exception {StringWriter writer new StringWriter();// 创建 JAXBContext 和 MarshallerJAXBContext context JAXBContext.newInstance(obj.ge…...

NumPy 秘籍中文第二版:八、质量保证

原文&#xff1a;NumPy Cookbook - Second Edition 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 “如果您对计算机撒谎&#xff0c;它将帮助您。” – Perry Farrar&#xff0c;ACM 通讯&#xff0c;第 28 卷 在本章中&#xff0c;我们将介绍以下秘籍&#xff1a; …...

[ 应急响应篇基础 ] 日志分析工具Log Parser配合login工具使用详解(附安装教程)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…...

什么是MVVM?

MVVM 是 Model-View-ViewModel 的缩写&#xff0c;是M-V-VM三部分组成。它本质上就是MVC的改进版。 M&#xff1a;Model 代表数据模型&#xff0c;也可以在Model中定义数据修改和操作的业务逻辑。 V&#xff1a;View 代表视图UI&#xff0c;它负责将数据模型转化成UI 展现出来。…...

Java 企业电子招投标采购系统源码:采购过程更规范,更透明

满足采购业务全程数字化&#xff0c; 实现供应商管理、采购需求、全网寻源、全网比价、电子招 投标、合同订单执行的全过程管理。 电子招标采购&#xff0c;是指在网上寻源和采购产品和服务的过程。对于企业和企业主来说&#xff0c;这是个既省钱又能提高供应链效率的有效方法…...