Python面试宝典第3题:石子游戏

题目

        Alice 和 Bob 用几堆石子在做游戏:一共有偶数堆石子,排成一行;每堆都有正整数颗石子,数目为 piles[i] 。游戏以谁手中的石子最多来决出胜负,石子的总数是奇数 ,所以没有平局。

        Alice 和 Bob 轮流进行,Alice 先开始 。 每个回合,玩家从行的开始或结束处取走整堆石头。 这种情况一直持续到没有更多的石子堆为止,此时手中石子最多的玩家获胜。

        假设 Alice 和 Bob 都发挥出最佳水平,当 Alice 赢得比赛时返回 true ,当 Bob 赢得比赛时返回 false 。

        示例 1:

输入:piles = [5,3,4,5]
输出:true
解释:Alice 先开始,只能拿前 5 颗或后 5 颗石子 。
假设他取了前 5 颗,这一行就变成了 [3,4,5] 。
如果 Bob 拿走前 3 颗,那么剩下的是 [4,5],Alice 拿走后 5 颗赢得 10 分。
如果 Bob 拿走后 5 颗,那么剩下的是 [3,4],Alice 拿走后 4 颗赢得 9 分。
这表明,取前 5 颗石子对 Alice 来说是一个胜利的策略,所以返回 true 。

        示例 2:

输入:piles = [3,7,2,3]
输出:true

暴力法

        在石子游戏这类策略游戏中应用暴力法,通常意味着递归地尝试所有可能的取石子序列,直到游戏结束,然后根据这些尝试的结果判断先手玩家是否能赢得比赛。由于暴力法的指数级时间复杂度,在实际应用中,这种解法只适用于非常小的输入规模。使用暴力法求解本题的主要步骤如下。

        1、定义递归函数。接收当前石子堆数组、Alice和Bob当前的得分、以及当前轮到的玩家作为参数。

        2、递归尝试。对于当前可选的每堆石子,分别尝试从两端取走,更新双方得分,并递归调用函数检查后续步骤。

        3、回溯判断。汇总所有尝试的结果,只要有任意一条路径能让Alice最终得分高于Bob,则返回True。否则,返回False。

        根据上面的算法步骤,我们可以得出下面的示例代码。

def stone_game_brute_force(piles, aliceScore=0, bobScore=0, isAlice=True):# 没有更多石子堆,判断Alice是否赢得比赛if not piles:return aliceScore > bobScore# 选择取走最左边还是最右边的石子堆for i in (0, -1):nextPile = piles[i]# 移除已取的石子堆nextPiles = piles[:i] + piles[i+1:]# 根据当前轮到的玩家更新分数nextAliceScore = 0nextBobScore = 0if isAlice:nextAliceScore = aliceScore + nextPileelse:nextBobScore = bobScore + nextPile# 递归尝试下一步if stone_game_brute_force(nextPiles, nextAliceScore, bobScore, not isAlice):return Trueif stone_game_brute_force(nextPiles, aliceScore, nextBobScore, not isAlice):return True# 如果所有尝试都无法让Alice赢得比赛,则返回Falsereturn Falsepiles = [5, 3, 4, 5]
# 输出: True
print(stone_game_brute_force(piles))

动态规划法

        考虑到游戏的最优策略具有重叠子问题和最优子结构的特点,故可以使用动态规划法来解决。我们可以定义一个二维数组dp,其中dp[i][j]表示在石子堆从第i堆到第j堆之间,当前玩家与对手玩家之间的最大得分差。由于每次操作后剩下的石子堆序列也会形成一个新的子问题,因此可以通过比较两端石子堆大小来决定先手玩家的最佳选择,并以此更新dp数组。使用动态规划法求解本题的主要步骤如下。

        1、状态定义。定义dp[i][j]为在石子堆区间[i, j]内,按照最优策略进行游戏,先手相对于后手所能多获得的石子数量。这里的i和j代表石子堆的索引,i ≤ j。

        2、状态转移。状态转移的关键在于:考虑先手玩家的最优选择。对于区间[i, j],先手有以下两种选择。

        (1)取走左侧的石子堆,此时后手面对的是区间[i+1, j],先手优势变为piles[i] - dp[i+1][j]。

        (2)取走右侧的石子堆,此时后手面对的是区间[i, j-1],先手优势变为piles[j] - dp[i][j-1]。

        3、边界条件。当区间长度为1,即只有一个石子堆时,dp[i][i] = piles[i]。因为此时先手直接拿走全部石子,相对于后手(无石子可拿)优势就是这堆石子的全部数量。

        根据上面的算法步骤,我们可以得出下面的示例代码。首先,我们创建一个大小为n x n的二维数组dp,并初始化对角线上的元素,即单个石子堆的情况。然后,按照区间长度从小到大(从长度为2到n)遍历所有可能的区间,并应用状态转移方程更新dp数组中的值。最后,dp[0][n-1]即表示整个石子序列按照最优策略进行游戏时,先手相对于后手的石子优势。如果dp[0][n-1] > 0,则表示Alice能赢得比赛。

def stone_game_dp(piles):n = len(piles)# 初始化dp数组,大小为n*n,用于存储区间[i, j]内先手的优势dp = [[0]*n for _ in range(n)]# 边界条件:单个石子堆,先手直接拿走全部,优势为该堆石子的数量for i in range(n):dp[i][i] = piles[i]# 构建状态转移方程,从长度为2的区间开始遍历到整个序列for length in range(2, n + 1):# 遍历区间起始位置for i in range(n - length + 1):# 计算区间结束位置j = i + length - 1# 应用状态转移方程,选择使先手优势最大的操作dp[i][j] = max(piles[i] - dp[i+1][j], piles[j] - dp[i][j-1])# 如果dp[0][n-1] > 0,说明按照最优策略,先手能赢得比赛return dp[0][n-1] > 0piles = [5, 3, 4, 5]
# 输出: True
print(stone_game_dp(piles))

总结

        暴力法通过递归尝试所有可能的取石子序列来决定胜负,其时间复杂度是指数级别的。具体来说,对于每一步决策,都有两种选择(取左侧或右侧的石子堆),故总的时间复杂度大约为O(2^n),其中n是石子堆的数量。在递归过程中,每一层递归调用都会消耗一定的栈空间来存储函数调用信息。最深的递归深度同样与石子堆的数量n有关,因此空间复杂度也是O(n)。暴力法虽然直观易懂,但对于较大的n值来说,其执行时间将迅速增长至不可接受的程度。

        动态规划法通过构建一个二维数组来避免重复计算,时间复杂度主要来自于填充这个数组的过程。对于长度为n的石子堆序列,需要填充一个n×n的表格,每个状态的计算基于之前较小状态的计算结果,因此总体的时间复杂度为O(n^2)。其空间复杂度同样为O(n^2),因为需要一个n×n的二维数组来存储每个子问题的解。动态规划法通过预计算和存储子问题的解,避免了重复计算,极大地提高了效率。对于石子游戏这类具有重叠子问题和最优子结构的问题,动态规划是十分有效的。

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

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

相关文章

CV01_相机成像原理与坐标系之间的转换

目录 0.引言:小孔成像->映射表达式 1. 相机自身的运动如何表征?->外参矩阵E 1.1 旋转 1.2 平移 2. 如何投影到“像平面”?->内参矩阵K 2.1 图像平面坐标转换为像素坐标系 3. 三维到二维的维度是如何丢失的?…

LVS-负载均衡

目录 一、概念 二、LVS工作原理 1. ipvs/ipvsadm 2.名词: 三、常用命令 四、工作模式 1.NAT地址转换模式 (1)工作流程 (2)特点 (3)实验过程 a.环境准备: b.修改测试机的…

UE5 动画蓝图

文章目录 一、State Machines二、Blend Spaces三、Aim Offset四、Montage 初步介绍 Unreal Engine 5 Tutorial - Animation Blueprint Part 1: State Machines (youtube.com) Unreal Engine 5 Tutorial - Animation Blueprint Part 2: Blend Spaces (youtube.com) Unreal Engi…

非静压模型SWASH学习(8)——三维孤立波在锥形岛屿上的爬坡过程(Runup of solitary waves on a conical island)

三维孤立波在锥形岛屿上的爬坡过程(Runup of solitary waves on a conical island) 算例简介模型配置网格及参数设置网格与地形初始条件与边界条件数值求解方法输出设置模拟时间 波浪(孤立波)入射边界的时间序列.bnd文件模拟结果注…

[吃瓜教程]南瓜书第4章决策树

1.决策树的算法原理 从逻辑角度,条件判断语句的组合;从几何角度,根据某种准则划分特征空间; 是一种分治的思想,其最终目的是将样本约分约纯,而划分的核心是在条件的选择或者说是**特征空间的划分标准 ** …

mac安装达梦数据库

参考:mac安装达梦数据库​​​​​​ 实践如下: 1、下载达梦Docker镜像文件 同参考链接 2、导入镜像 镜像可以随便放在某个目录,相当于安装包,导入后就没有作用了。 查找达梦镜像名称:dm8_20240613_rev229704_x86…

第1章 人工智能的基础概念与应用导论

亲爱的读者朋友们,你们好!欢迎来到这个充满神奇与奥秘的人工智能世界。我知道,对于很多人来说,人工智能(AI)可能是个既神秘又高大上的词汇,仿佛遥不可及,只存在于科幻电影或者顶级科…

Figma-ui设计学习APP Store

Figma汉化:Figma 中文社区_插件组件库,软件汉化教程 - Figma.Cool 选择Chorme汉化版离线包 插件安装: 打开浏览器安装扩展,解压加载进去即可。 打开标尺,设置左右内边距参考线(左21 右356),wi…

【postgresql】版本学习

PostgreSQL 17 Beta 2 发布于2024-06-27。 PostgreSQL 17 Beta 2功能和变更功能的完整列表:PostgreSQL: Documentation: 17: E.1. Release 17 ​ 支持的版本: 16 ( 当前版本) / 15 / 14 / 13 / 12 ​ 不支持的版本: 11 / 10 / 9.6 / 9.5 /…

探索工业AI智能摄像机的高端科技

在当今快速发展的工业智能化领域,工业AI智能摄像机系列以其卓越的性能和多功能性在国内外备受关注(文末有国外工程师的评测链接)。搭载Raspberry Pi CM4支持的旨在广泛应用,涵盖从简单的条形码扫描到基于人工智能的工业环境中的缺…

7.1.SQL注入-基于函数报错的方式来利用updatexml()

基于函数报错的方式来进行利用-字符型(本页updatexml()) 前提条件是后台数据库没有屏蔽数据库语法报错信息 updatexml()方法详解 注释: 第一个参数,意思就是xml文档的名称 第二个参数,意思就是定位到xml文档中指定…

OFDM关键技术——ICI消除技术

ICI消除算法可以分为以下几类: 1、OFDM符号长度和载波间隔的最优选择,较短的符号周期更有利于降低ICI 2、OFDM基信号的最佳选择,选择频域衰减更快的OFDM基带脉冲 3、自干扰消除技术,将信息调制到一组子载波上 4、频域均衡器&a…

认识100种电路之耦合电路

在电子电路的世界中,耦合电路宛如一座精巧的桥梁,连接着各个功能模块,发挥着至关重要的作用。 【为什么电路需要耦合】 在复杂的电子系统中,不同的电路模块往往需要协同工作,以实现特定的功能。然而,这些模…

网络爬虫(二) 哔哩哔哩热榜高频词按照图片形状排列

我们有时候需要爬取结果生成为自定义的词云图 生成自定义的词云图通常需要以下步骤: 1. 爬取数据:使用爬虫工具或库,如requests、BeautifulSoup等,可以爬取网页、论坛、社交媒体等平台上的文本数据。 2. 数据预处理&#xff1a…

uniapp微信小程序电子签名

先上效果图,不满意可以直接关闭这页签 新建成单独的组件,然后具体功能引入,具体功能点击签名按钮,把当前功能页面用样式隐藏掉,v-show和v-if也行,然后再把这个组件显示出来。 【签名-撤销】原理是之前绘画时…

AI影像测量:开启测量仪器的智能之眼

在基于机器视觉的影像测量中,一些复杂特征传统测量需要人工手动选点测量,不仅易受到人为因素的干扰,而且极大的降低测量效率,提高了人力成本和生产成本。AI影像测量技术运用先进的机器视觉和深度学习算法,可快速、准确…

【JVM】JVM 内存结构

程序计数器 Cpu 要不停的切换执行线程,所以在切换回同一个线程的时候要知道程序执行到哪了,程序计数器(PC 计数器),用来存储指向下一条指令的地址,也就是将要执行的代码。 程序的分支、循环、跳转、异常处…

QuickBooks 2024 for Mac:财务智慧,触手可及

QuickBooks 2024 for Mac是一款专为Mac用户设计的专业财务管理软件,它集成了多种实用功能,助力企业和个人用户高效管理财务事务。 📊 全面的财务管理工具:QuickBooks 2024 for Mac 提供了一套全面的财务管理功能,包括…

用免费的可视化工具制作3D智慧城市大屏,融合数字孪生,引领数据升级

在如今数据驱动的时代,越来越多的场景中都有可视化大屏的身影,许多企业和政府部门也从常规的二维看板渐渐地转向更加炫酷,立体的3D可视化大屏。3D可视化大屏成为了展示复杂数据、实时监控业务动态的重要工具。本文将详细介绍如何使用免费的数…

物联网工业级网关解决方案 工业4G路由器助力智慧生活

随着科技的飞速发展,无线通信技术正逐步改变我们的工作与生活。在这个智能互联的时代,一款高性能、稳定可靠的工业4G路由器成为了众多行业不可或缺的装备。工业4G路由器以其卓越的性能和多样化的功能,助力我们步入智慧新纪元。 一、快速转化&…