经典区间 DP & 经典博弈游戏

简介: 经典区间 DP & 经典博弈游戏

网络异常,图片无法展示
|


题目描述



这是 LeetCode 上的 877. 石子游戏 ,难度为 中等


Tag : 「区间 DP」、「博弈论」


亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] 。


游戏以谁手中的石子最多来决出胜负。石子的总数是奇数,所以没有平局。


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


假设亚历克斯和李都发挥出最佳水平,当亚历克斯赢得比赛时返回 true ,当李赢得比赛时返回 false 。


示例:


输入:[5,3,4,5]
输出:true
解释:
亚历克斯先开始,只能拿前 5 颗或后 5 颗石子 。
假设他取了前 5 颗,这一行就变成了 [3,4,5] 。
如果李拿走前 3 颗,那么剩下的是 [4,5],亚历克斯拿走后 5 颗赢得 10 分。
如果李拿走后 5 颗,那么剩下的是 [3,4],亚历克斯拿走后 4 颗赢得 9 分。
这表明,取前 5 颗石子对亚历克斯来说是一个胜利的举动,所以我们返回 true 。
复制代码


提示:


  • 2 <= piles.length <= 500
  • piles.length 是偶数。
  • 1 <= piles[i] <= 500
  • sum(piles) 是奇数。


动态规划



定义 f[l][r]f[l][r] 为考虑区间 [l,r][l,r],在双方都做最好选择的情况下,先手与后手的最大得分差值为多少。


那么 f[1][n]f[1][n] 为考虑所有石子,先手与后手的得分差值:


  • f[1][n] > 0f[1][n]>0,则先手必胜,返回 True
  • f[1][n] < 0f[1][n]<0,则先手必败,返回 False


不失一般性的考虑 f[l][r]f[l][r] 如何转移。根据题意,只能从两端取石子(令 pilespiles 下标从 11 开始),共两种情况:


  • 从左端取石子,价值为 piles[l - 1]piles[l1];取完石子后,原来的后手变为先手,从 [l + 1, r][l+1,r] 区间做最优决策,所得价值为 f[l + 1][r]f[l+1][r]因此本次先手从左端点取石子的话,双方差值为


piles[l - 1] - f[l + 1][r]piles[l1]f[l+1][r]


  • 从右端取石子,价值为 piles[r - 1]piles[r1];取完石子后,原来的后手变为先手,从 [l, r - 1][l,r1] 区间做最优决策,所得价值为 f[l][r - 1]f[l][r1]因此本次先手从右端点取石子的话,双方差值为


piles[r - 1] - f[l][r - 1]piles[r1]f[l][r1]


双方都想赢,都会做最优决策(即使自己与对方分差最大)。因此 f[l][r]f[l][r] 为上述两种情况中的最大值。


根据状态转移方程,我们发现大区间的状态值依赖于小区间的状态值,典型的区间 DP 问题。


按照从小到大「枚举区间长度」和「区间左端点」的常规做法进行求解即可。


代码:


class Solution {
    public boolean stoneGame(int[] ps) {
        int n = ps.length;
        int[][] f = new int[n + 2][n + 2]; 
        for (int len = 1; len <= n; len++) { // 枚举区间长度
            for (int l = 1; l + len - 1 <= n; l++) { // 枚举左端点
                int r = l + len - 1; // 计算右端点
                int a = ps[l - 1] - f[l + 1][r];
                int b = ps[r - 1] - f[l][r - 1];
                f[l][r] = Math.max(a, b);
            }
        }
        return f[1][n] > 0;
    }
}
复制代码


  • 时间复杂度:O(n^2)O(n2)
  • 空间复杂度:O(n^2)O(n2)


博弈论



事实上,这还是一道很经典的博弈论问题,也是最简单的一类博弈论问题。


为了方便,我们称「石子序列」为石子在原排序中的编号,下标从 11 开始。


由于石子的堆数为偶数,且只能从两端取石子。因此先手后手所能选择的石子序列,完全取决于先手每一次决定。


由于石子的堆数为偶数,对于先手而言:每一次的决策局面,都能「自由地」选择奇数还是偶数的序列,从而限制后手下一次「只能」奇数还是偶数石子。


具体的,对于本题,由于石子堆数为偶数,因此先手的最开始局面必然是 [奇数, 偶数][,],即必然是「奇偶性不同的局面」;当先手决策完之后,交到给后手的要么是 [奇数,奇数][,] 或者 [偶数,偶数][,],即必然是「奇偶性相同的局面」;后手决策完后,又恢复「奇偶性不同的局面」交回到先手 ...


不难归纳推理,这个边界是可以应用到每一个回合。


因此先手只需要在进行第一次操作前计算原序列中「奇数总和」和「偶数总和」哪个大,然后每一次决策都「限制」对方只能选择「最优奇偶性序列」的对立面即可。


同时又由于所有石子总和为奇数,堆数为偶数,即没有平局,所以先手必胜。


代码:


class Solution {
    public boolean stoneGame(int[] piles) {
        return true;
    }
}
复制代码


  • 时间复杂度:O(1)O(1)
  • 空间复杂度:O(1)O(1)


最后



这是我们「刷穿 LeetCode」系列文章的第 No.877 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先将所有不带锁的题目刷完。

在这个

系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。


为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:github.com/SharingSour…


在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。

相关文章
|
15天前
|
人工智能 机器人 Serverless
探展打卡 Serverless,2025 云栖大会来了
2025 云栖大会即将于 9 月 24 日至 26 日在杭州云栖小镇盛大开幕,本次大会分别设置 Serverless 体验区与【Serverless 助力 AI Agent 开发与落地】分论坛,参会者可现场体验热门 Serverless 产品,近距离了解最新技术进展。无论是探索函数计算、Serverless 应用引擎 SAE 的创新实践,还是参与 AI Agent 开发的深度讨论,这里都将为您提供前沿洞察与实操机会。
|
21天前
|
数据采集 数据可视化 物联网
数据工程师必看:10大主流数据清洗工具全方位功能对比
面对杂乱数据,高效清洗是分析关键。本文盘点10款主流工具:从企业级Informatica、Talend,到业务友好的Alteryx、Tableau Prep,技术向的Python、Nifi,再到轻量级Excel+Power Query,覆盖各类场景。帮你选对工具,提升效率,告别无效加班。
数据工程师必看:10大主流数据清洗工具全方位功能对比
|
26天前
|
存储 人工智能 弹性计算
阿里云gpu云服务器收费价格,热门实例简介和最新按量、1个月、1年收费标准参考
在阿里云所有gpu云服务器实例规格中,计算型gn5、gn6i、gn6v、gn7i和最新推出的gn8is、gn8v-tee等实例规格是其中比较热门的gpu云服务器实例。阿里云gpu云服务器最新租用价格参考,适合AI推理/训练的16核60G+1张A10 24G显存(gn7i-c16g1.4xlarge),按量优惠价1.9/小时起。本文为大家展示阿里云gpu云服务器中gn5、gn6i等热门实例规格的主要性能和适用场景以及最新按量和1个月、1年收费标准,以供参考。
|
21天前
|
存储 人工智能 弹性计算
阿里云权益中心详解:个人开发者与企业用户和高校学生与教师的综合优惠平台
阿里云权益中心是什么?简单来说,它是一个致力于为高校学生和教师、个人开发者、企业用户提供优惠上云和快速上云的平台,本文将深度解析权益中心的核心活动、适用场景及参与方式,以供您了解和参考。
|
1月前
|
SQL 关系型数据库 API
如何开发工程项目部管理系统中的质量管理板块(附架构图+流程图+代码参考)
本文详解如何构建工程项目管理系统中的质量管理模块,涵盖质量检查计划、检查登记、问题清单、整改记录及问题看板五大核心功能。内容包括系统架构设计、业务流程、数据模型、API接口、开发技巧及上线建议,助力实现质量风险的数字化闭环管理,提升项目验收效率与合规性。
|
8月前
|
机器学习/深度学习 人工智能 缓存
探秘 DeepSeek:那些你必须了解的事
DeepSeek是一家由中国幻方量化支持的创新型AI公司,专注于开发高性能、低成本的大语言模型。其独特的技术路径打破了参数规模、能耗成本和认知可靠性之间的“三元悖论”,实现了在单张显卡上运行170亿参数模型的突破。DeepSeek通过开源策略和高性价比模型(如DeepSeek-R1),大幅降低了AI应用门槛,推动了全球开发者社区的发展。其应用场景广泛覆盖教育、医疗、金融等领域,显著提升了工作效率和服务质量。DeepSeek的成功不仅在于技术创新,更在于其开放合作的理念,正引领AI行业的新变革。
1018 9
探秘 DeepSeek:那些你必须了解的事
|
12月前
|
JSON 安全 数据处理
淘宝开放平台订单接口的详细使用教程
本教程详细介绍如何使用淘宝开放平台订单接口,涵盖注册申请、环境准备、接口调用及数据处理等步骤。首先,需注册开发者账号并创建应用,获取必要的权限与密钥。接着,选择合适的编程语言和工具,安装必要库,配置开发环境。然后,了解并调用相关订单接口,设置请求参数,生成签名,发送请求并处理响应。最后,进行数据处理和错误处理,确保程序稳定可靠。
|
9月前
|
数据采集 机器学习/深度学习 存储
《构建人工智能新质生产力创新生态:路径与策略》
在科技飞速发展的时代,人工智能成为提升国家竞争力和推动经济高质量发展的关键力量。构建其创新生态需从五方面入手:强化技术研发创新,加大科研投入、建设创新平台、鼓励自主创新;完善数据要素体系,提升数据质量、打破数据孤岛、保障数据安全;加强人才队伍建设,优化高校培养体系、开展职业培训、引进高端人才;推动产业协同发展,培育龙头企业、促进产业集群发展、加强产业联盟建设;优化政策法规环境,完善政策支持体系、加快立法进程、加强伦理监管。这是一项系统工程,需要各方共同努力,为经济社会发展注入新动力。
236 4
|
10月前
|
存储 人工智能 运维
AI导购革命:揭秘主动式智能导购AI助手的构建之道
本文基于《主动式智能导购AI助手构建》解决方案的实际部署体验,从引导与文档帮助、解决方案原理与架构理解、百炼大模型及函数计算应用明晰度、生产环境步骤指导四个方面进行了详细评估。指出尽管该方案具有创新性和实用性,但在文档详尽性、技术细节解释及生产环境适应性等方面仍有待提升。通过进一步优化,可增强解决方案的可用性和用户满意度。
365 31