欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > 博弈论算法

博弈论算法

2025/11/10 21:45:39 来源:https://blog.csdn.net/m0_52238102/article/details/146118320  浏览:    关键词:博弈论算法

一、减法游戏

  • 初始有一个数 n。

  • 两个玩家轮流操作,每次可以减去 1 到 9 之间的任意整数。

  • 将数减到 0 的玩家获胜。

可以发现规律:

减法游戏只需要判断当前数取模是否为0,即可快速判断胜负。

例题:

Leetcode 292. Nim 游戏

二、取球博弈

两个人玩取球的游戏。一共有 N个球,每人轮流取球,每次可取集合 n1,n2,n3中的任何一个数目。如果无法继续取球,则游戏结束。此时,持有奇数个球的一方获胜。
如果两人都是奇数,则为平局。假设双方都采用最聪明的取法第一个取球的人一定能赢吗?试编程解决这个问题。

该题是一个典型的博弈论问题,涉及取球游戏奇偶性判断。这里使用动态规划来解决此问题,我们需要递推出来N之前的所有dp值。因为要考虑双方手里的球的奇偶性,因为有三种状态,平手状态需要考虑对方是否也处于必败态。

N = [int(x) for x in input().split()]
X = [int(x) for x in input().split()]
min_value = min(N)dp = [[[-1 for _ in range(2)] for _ in range(2) ]for _ in range(1000)]
for i in range(1000):if i < min_value:dp[i][0][0] = 0dp[i][0][1] = -1dp[i][1][0] = 1dp[i][1][1] = 0for id, c in enumerate(N):temp = i - cif temp >= 0:dp[i][0][0] = max(dp[i][0][0], -dp[temp][0][c % 2])dp[i][0][1] = max(dp[i][0][1], -dp[temp][1][c % 2])dp[i][1][0] = max(dp[i][1][0], -dp[temp][0][(c + 1) % 2])dp[i][1][1] = max(dp[i][1][1], -dp[temp][1][(c + 1) % 2])
for i in range(len(X)):if dp[X[i]][0][0] == 1:print("+",end=" ")elif dp[X[i]][0][0] == 0:print("0",end=" ")else:print("-",end=" ")

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com