LeetCode 1563. 石子游戏 V

【leetcode经典题目】石子问题--最大最小问题的解析 文章目录1686. 石子游戏 VI1690. 石子游戏 VII 以石子问题为代表的最大最小问题是leetcode经常出现的一类博弈论类型的题目。主要的思路贪心或者DP。 1686. 石子游戏 VI 特点:不是两侧取而是任取,评价标准是各自拿到的石子的和。 对于这种任取的思路,相当于是对石子堆按照某种顺序进行排序,如果数据量很大的话,无法找到恨到的方法。因此很容易想到贪心策略。 那么核心问题就是,如何贪心,按照什么进行贪心。两个路径:对于同一块石子,两个人的权重不同,要不让va[i]-vb[i]最大,要不让 阅读详情

题目链接:LeetCode 1563. 石子游戏 V

题意:

      几块石子 排成一行 ,每块石子都有一个关联值,关联值为整数,由数组 stoneValue 给出。

游戏中的每一轮:Alice 会将这行石子分成两个 非空行(即,左侧行和右侧行);Bob 负责计算每一行的值,即此行中所有石子的值的总和。Bob 会丢弃值最大的行,Alice 的得分为剩下那行的值(每轮累加)。如果两行的值相等,Bob 让 Alice 决定丢弃哪一行。下一轮从剩下的那一行开始。

只 剩下一块石子 时,游戏结束。Alice 的分数最初为 0 。

返回 Alice 能够获得的最大分数 。

 

解题思路:

   动态规划

 

采用递归加记忆化搜索实现动态规划

class Solution {
	public $dp = array();
    /**
     * @param Integer[] $stoneValue
     * @return Integer
     */
    function stoneGameV($stoneValue) {
    	$n = count($stoneValue);
    	for($i = 0; $i < $n; $i++) {
    		for($j = 0; $j < $n; $j++) {
    			$this->dp[$i][$j] = -1;
    		}
    	}
    	return $this->dfs(0, $n-1, $stoneValue);
    }
    function dfs($l, $r, $arr) {
    	if($l == $r) {
    		return 0;
    	}
    	if($this->dp[$l][$r] != -1) {
    		return $this->dp[$l][$r];
    	}
    	$sum = 0; $ans = 0; $cur = 0;
    	for($i = $l; $i <= $r; $i++) {
    		$sum += $arr[$i];
    	}
    	for($mid = $l; $mid < $r; $mid++) {
    		$cur += $arr[$mid];
    		$now = 0;
    		if($cur < $sum - $cur) {
    			$now = $cur + $this->dfs($l, $mid, $arr);
    		} else if($cur > $sum - $cur){
    			$now = $sum - $cur + $this->dfs($mid+1, $r, $arr);
    		} else {
    			$now = $cur + max($this->dfs($l, $mid, $arr), $this->dfs($mid+1, $r, $arr));
    		}
    		$ans = max($ans, $now);
    	}
    	return $this->dp[$l][$r] = $ans;
    }
}

注意:O(N^3)复杂度高,超时代码

class Solution {

    /**
     * @param Integer[] $stoneValue
     * @return Integer
     */
    function stoneGameV($stoneValue) {
    	$dp = array();$sum = array();
    	$n = count($stoneValue);
    	for($i = 0; $i < $n; $i++) {
    		for($j = 0; $j < $n; $j++) {
    			$dp[$i][$j] = 0;
    		}
    	}
    	$sum[0] = $stoneValue[0];
    	for($i = 1; $i < $n; $i++) {
    		$sum[$i] = $sum[$i-1] + $stoneValue[$i];
    	}
    	for($len = 0; $len <= $n; $len++) {
    		for($l = 0; $l + $len < $n; $l++) {
    			$r = $l + $len;
    			for($mid = $l; $mid < $r; $mid++) {
    				if($l > $mid || $mid + 1 > $r) {
    					break;
    				}
    				$lv = $sum[$mid] - ($l > 0 ? $sum[$l-1]:0);
    				$lr = $sum[$r] - $sum[$mid];
    				if($lv == $lr) {
    					$dp[$l][$r] = max($dp[$l][$r], $lv+max($dp[$l][$mid], $dp[$mid+1][$r]));
    				} else if($lv > $lr){
    					$dp[$l][$r] = max($dp[$l][$r], $dp[$mid+1][$r] + $lr);
    				} else {
    					$dp[$l][$r] = max($dp[$l][$r], $dp[$l][$mid] + $lv);
    				}
    			}
    		}
    	}
    	return $dp[0][$n-1];
    }
}

 

【C++ 博弈论 动态规划】1563 石子游戏 V|2087 几块石子 排成一行 ,每块石子都有一个关联值,关联值为整数,由数组 stoneValue 给出。 游戏中的每一轮:Alice 会将这行石子分成两个 非空行(即,左侧行和右侧行);Bob 负责计算每一行的值,即此行中所有石子的值的总和。Bob 会丢弃值最大的行,Alice 的得分为剩下那行的值(每轮累加)。如果两行的值相等,Bob 让 Alice 决定丢弃哪一行。下一轮从剩下的那一行开始。 只 剩下一块石子 时,游戏结束。Alice 的分数最初为 0 。 返回 Alice 能够获得的最大分数 。 阅读详情

相关推荐

每日算法讲解(十):使用BP神经网络进行回归任务

BP神经网络是由输入层、隐藏层和输出层组成的多层前馈神经网络,通过反向传播算法(Backpropagation)来调整网络权重和偏置,以最小化预测误差。前向传播:将输入数据通过网络,计算每层的激活值和输出。计算误差:根据预测值和真实值之间的差异计算损失函数值。反向传播:从输出层开始,逐层向后计算梯度,并更新每层的权重和偏置。重复迭代:通过多次迭代,逐步减小预测误差,优化模型参数。接下来,我们定义一个包含一个输入层、两个隐藏层和一个输出层的BP神经网络模型。# 定义模型# 编译模型。

rhtee的博客 1727

LeetCode题解(1563):石子游戏V(Python)

题目:原题链接(困难) 标签:动态规划、记忆化递归 解法 时间复杂度 空间复杂度 执行用时 Ans 1 (Python) O(N3)O(N^3)O(N3) O(N2)O(N^2)O(N2) 超出时间限制(118/131) Ans 2 (Python) O(N3)O(N^3)O(N3) O(N2)O(N^2)O(N2) 9944ms (5.75%) Ans 3 (Python) 解法一: class Solution: def stoneGameV(self, sto

长行 639

Qt中输出中文出现乱码(win10系统下)

当我刚开始在win10下使用Qt Creator(4.3.0版本)时,遇到过这么个问题:当程序输出中文时,中文会乱码,程序本身的中文未乱码。 乱码截图如下: 我查阅了很多资料,最后在自己的不断的尝试下,解决了乱码问题。进入主题,具体如何解决乱码? ① 首先,我们先设置一下,可以直观在Qt界面上看到文件的编码方式: 点击工具(tool)->选项(option)->文本编辑器->显示->Diplayfileencoding,将其勾选上,点击apply,即可,截图如下...

请叫我皮皮虾的博客 5200

leetcode1563. 石子游戏 V(Python3、c++)

文章目录leetcode1563. 石子游戏 V方法:动态规划(递归+记忆化)思路:代码:Python3:cpp:结果: leetcode1563. 石子游戏 V 几块石子 排成一行 ,每块石子都有一个关联值,关联值为整数,由数组 stoneValue 给出。 游戏中的每一轮:Alice 会将这行石子分成两个 非空行(即,左侧行和右侧行);Bob 负责计算每一行的值,即此行中所有石子的值的总和。Bob 会丢弃值最大的行,Alice 的得分为剩下那行的值(每轮累加)。如果两行的值相等,Bob 让 Alice

weixin_43422466的博客 1245

用Arduino Uno和纸板做个扫地机器人?手把手教你复刻一个低成本DIY方案(附完整代码)

本文详细介绍了如何用Arduino Uno和纸板制作一款低成本DIY扫地机器人,涵盖材料准备、机械结构设计、电路系统搭建和智能清扫算法实现。通过开源硬件和日常废弃物,打造极致性价比的创客项目,适合初学者学习电子和编程。

weixin_42531588的博客 271

Ubuntu 20.04下Cube-Studio云原生平台单机部署全攻略(附避坑指南)

本文详细介绍了在Ubuntu 20.04系统上单机部署Cube-Studio云原生平台的完整流程,包括环境准备、Docker配置、Rancher与Kubernetes集群部署以及Cube-Studio核心组件安装。特别提供了官方文档未涵盖的实战技巧和常见问题解决方案,帮助开发者高效完成部署并避免常见陷阱。

weixin_29313423的博客 465

2024年C C++最全LeetCode 1563,2024年最新腾讯T2大牛亲自讲解

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/stone-game-v著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2401_84976585的博客 277

GameFramework框架详解之 DataTable配置表模块

一.前言: DataTable模块是项目的配置表模块,配置表一般是从excel导出csv/json/xml格式的,之所以是excel作为源文件,原因是因为策划同学使用配表最方便。然后一键导出到项目中,除了csv/json/xml配置文件外,一般还会伴随着导出配置的实体类,这样研发同学就可以使用了。GameFramework的DataTable模块也是秉持着这种一贯的策略来实现的。 二.DataRow DataRow在excel数据表中,对应的是一行数据,而在代码中对应的其实就是一条数据对象。 接口IData

TxNet 4726

LeetCode 1563. 石子游戏 V(DP)

文章目录1. 题目2. 解题2.1 区间DP 1. 题目 几块石子 排成一行 ,每块石子都有一个关联值,关联值为整数,由数组 stoneValue 给出。 游戏中的每一轮: Alice 会将这行石子分成两个 非空行(即,左侧行和右侧行); Bob 负责计算每一行的值,即此行中所有石子的值的总和。 Bob 会丢弃值最大的行,Alice 的得分为剩下那行的值(每轮累加)。 如果两行的值相等,Bob 让 Alice 决定丢弃哪一行。下一轮从剩下的那一行开始。 只 剩下一块石子 时,游戏结束。Alice 的分数最初

Michael是个半路程序员 3270

手把手教您如何在飞牛NAS上部署OpenClaw(Clawdbot/Moltbot)智能助手,接入钉钉,0成本使用(万字保姆级教程)

想在飞牛NAS上部署一个24小时待命的AI助手?🤖 本文手把手教您如何在飞牛NAS上部署一个完全免费的OpenClaw智能助手 ✅

XiaoqiangClub的博客 7232

【自监督学习完整教程】第 1 章:初识自监督学习

摘要: 自监督学习(SSL)是一种利用无标签数据自动生成伪标签进行模型训练的方法,有效降低了人工标注成本。本文对比了监督学习、无监督学习和SSL的差异,重点阐述了SSL通过设计PretextTasks(如图像旋转预测)从数据中提取深层特征的原理。实践部分以PyTorch实现图像旋转预测任务为例,展示了SSL的训练流程。实验表明,SSL能够学习通用视觉特征,适用于计算机视觉、自然语言处理等领域,尤其在标注数据稀缺的场景中表现优异。

u012133341的博客 260

[Leetcode/python3]第203场周赛题解

P1 圆形赛道上经过次数最多的扇区 给你一个整数 n 和一个整数数组 rounds 。有一条圆形赛道由 n 个扇区组成,扇区编号从 1 到 n 。现将在这条赛道上举办一场马拉松比赛,该马拉松全程由 m 个阶段组成。其中,第 i 个阶段将会从扇区 rounds[i - 1] 开始,到扇区 rounds[i] 结束。举例来说,第 1 阶段从 rounds[0] 开始,到 rounds[1] 结束。 请你以数组形式返回经过次数最多的那几个扇区,按扇区编号 升序 排列。 注意,赛道按扇区编号升序逆时针形成一个圆(请

其实我是一个艺术家 6113

OpenCASCADE:Direct3D CSharp 示例

OpenCASCADE:Direct3D CSharp 示例OpenCASCADE:Direct3D CSharp 示例 OpenCASCADE:Direct3D CSharp 示例 此示例演示了如何在使用CSharp和Windows Presentation Foundation (WPF)编写的.Net应用程序中使用 OCCT 和 DirectX 库。 .Net、OCCT (C++) 和 DirectX 级别之间的连接由用 C++/CLI 编写的代理库OCCProxy和D3DProxy提供。代理库OCC

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1824

千问 LeetCode 1563.石子游戏 V public int stoneGameV(int[] stoneValue)

存在一种 O(N^2) 的优化解法,利用单调性(随着分割点右移,左边和增加,右边和减少),但这通常涉及更复杂的预处理(如 dp2 和 dp3 数组维护前缀/后缀最大值)。先算长度为 2 的区间,再算长度为 3 的,以此类推,直到长度为 n。这是一个典型的区间 DP 问题,我们需要计算任意区间 [i, j] 内 Alice 能获得的最大分数。* 如果左边和 右边和,Bob 丢弃左边,Alice 得分右边和,下一轮在右边继续。2. Bob 计算两行的值(总和),丢弃值最大的那一行。

m0_37843156的博客 86

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

leetcode 困难题 1563. 石子游戏 V-Stone Game V

Problem:动态规划的呢,先求出前缀和prefix,dp[i][j]表示区间[i-1, j-1]内石子的最大得分初始化 dp[i][i+1] = min(stoneValue[i-1], stoneValue[i]);,也就是两个石子去掉最大值,得分就是次小值递推公式是:对dp[i][j],枚举i到j-1做分割点,像dp[1][3],[2, 3, 5]分割点分别是[[2], [3, 5]], [[2,3],[5]],也就是分割点是【1,2】,对应石子【2,3】

邹九的个人博客 238

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

LeetCode 第 203 场周赛 题解及思路

LeetCode 第 203 场周赛题解及思路 1560. 圆形赛道上经过次数最多的扇区 1561. 你可以获得的最大硬币数目 1562. 查找大小为 M 的最新分组 1563. 石子游戏 V

weixin_46323890的博客 521

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

每日leetcode

Bob 会丢弃值最大的行,Alice 的得分为剩下那行的值(每轮累加)。时间复杂度:因为会考虑所有区间,区间总数为n(n+1)/2=O(n^2),再加上每个区间会进行一次比那里,长度为O(L),不妨近似为O(n)——所以总的时间复杂度应该是O(n^3)。在第一轮中,Alice 将行划分为 [6,2,3],[4,5,5]。游戏结束,因为这行只剩下一块石头了。在第二轮中,Alice 将行分成 [6],[2,3]。空间复杂度:O(n^2)——引入了记忆化存储的n*n的数组,其余开销为栈开销,最坏是O(n)。

XiaoyaoCarter的博客 209

LeetCode 1686. 石子游戏 VI(贪心)

文章目录1. 题目2. 解题 1. 题目 Alice 和 Bob 轮流玩一个游戏,Alice 先手。 一堆石子里总共有 n 个石子,轮到某个玩家时,他可以 移出 一个石子并得到这个石子的价值。 Alice 和 Bob 对石子价值有 不一样的的评判标准 。 给你两个长度为 n 的整数数组 aliceValues 和 bobValues 。 aliceValues[i] 和 bobValues[i] 分别表示 Alice 和 Bob 认为第 i 个石子的价值。 所有石子都被取完后,得分较高的人为胜者。 如果两个

Michael是个半路程序员 1452

LeetCode 1690. 石子游戏 VII(博弈DP)

文章目录1. 题目2. 解题 1. 题目 石子游戏中,爱丽丝和鲍勃轮流进行自己的回合,爱丽丝先开始 。 有 n 块石子排成一排。每个玩家的回合中,可以从行中 移除 最左边的石头或最右边的石头,并获得与该行中剩余石头值之 和 相等的得分。 当没有石头可移除时,得分较高者获胜。 鲍勃发现他总是输掉游戏(可怜的鲍勃,他总是输),所以他决定尽力 减小得分的差值 。爱丽丝的目标是最大限度地 扩大得分的差值 。 给你一个整数数组 stones ,其中 stones[i] 表示 从左边开始 的第 i 个石头的值,如果爱丽

Michael是个半路程序员 2939

LeetCode的石子游戏系列

整理一下亚历克斯和李用两个人闲来无聊玩的7场石子游戏(╯‵□′)╯︵┻━┻ 文章目录总结具体题解877. 石子游戏1140. 石子游戏 II1406. 石子游戏 III1510. 石子游戏 IV1563. 石子游戏 V1686. 石子游戏 VI1690. 石子游戏 VII 总结 双方博弈的题一般都是动态规划解决。也不排除像第一场游戏有讨巧的解法,或者第6场用的贪心方法。 一般来讲,两端都可以取,考虑二维dp;只有一端,考虑一维dp;任意取,大概率贪心。 两端的情况,先看游戏7。 一端的情况,先看游戏3再看游

qq_41562704的博客 1322

公开游戏、有向有环图游戏

...

nameofcsdn的博客 1561

[LeetCode] 第 203 场周赛

第 203 场周赛 1560. 圆形赛道上经过次数最多的扇区 难度:Easy 题目描述: 1560. 圆形赛道上经过次数最多的扇区 解题思路: 最终的路径只跟起点和终点有关系 中间的路径都是均等出现的次数 class Solution { public: vector<int> mostVisited(int n, vector<int>& rounds) { vector<int> ans; int start =

WchStrife的博客 162

第 203 场力扣周赛题解

1560. 圆形赛道上经过次数最多的扇区 思路:按照题意模拟即可。 class Solution { public List<Integer> mostVisited(int n, int[] rounds) { int mx = 0; int[] nums = new int[n + 1]; List<Integer> ans = new ArrayList<>(); nums[round

信仰.的博客 394

LeetCode 486. 预测赢家(博弈DP)

文章目录1. 题目2. 解题 1. 题目 给定一个表示分数的非负整数数组。 玩家 1 从数组任意一端拿取一个分数,随后玩家 2 继续从剩余数组任意一端拿取分数,然后玩家 1 拿,…… 。 每次一个玩家只能拿取一个分数,分数被拿取之后不再可取。直到没有剩余分数可取时游戏结束。 最终获得分数总和最多的玩家获胜。 给定一个表示分数的数组,预测玩家1是否会成为赢家。 你可以假设每个玩家的玩法都会使他的分数最大化。 示例 1: 输入:[1, 5, 2] 输出:False 解释:一开始,玩家1可以从1和2中进行选择。

Michael是个半路程序员 1874

LeetCode 每日一题 2026/8/17-2026/8/23

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步

AlphaTao的博客 222

力扣OJ(1501-1600)

。。

nameofcsdn的博客 944
上一篇: LeetCode 1547. 切棍子的最小成本
下一篇: LeetCode 684. 冗余连接
error0318
博客等级 码龄9年 57粉丝 515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值