DP31 取大小游戏中的最优策略(附:如何对DP[0][n]进行对角线递推) Optimal Strategy for a Game @geeksforgeeks

麻将游戏 题解 麻将游戏 题目 在一种"麻将"游戏中,游戏是在一个有W*H格子的矩形平板上进行的。每个格子可以放置一个麻将牌,也可以不放(如图所示)。玩家的目标是将平板上的所有可通过一条路径相连的两张相同的麻将牌,从平板上移去。最后如果能将所有牌移出平板,则算过关。 这个游戏中的一个关键问题是:两张牌之间是否可以被一条路径所连接,该路径满足以下两个特性: 1. 它由若干条线段组成,每条线段要么是水平方向,要么是垂... 阅读详情

Problem statement: Consider a row of n coins of values v1 . . . vn, where n is even. We play a game against an opponent by alternating turns. In each turn, a player selects either the first or last coin from the row, removes it from the row permanently, and receives the value of the coin. Determine the maximum possible amount of money we can definitely win if we move first.

Note: The opponent is as clever as the user.

Let us understand the problem with few examples:

    1. 5, 3, 7, 10 : The user collects maximum value as 15(10 + 5)

    2. 8, 15, 3, 7 : The user collects maximum value as 22(7 + 15)

Does choosing the best at each move give an optimal solution?

No. In the second example, this is how the game can finish:

1.
…….User chooses 8.
…….Opponent chooses 15.
…….User chooses 7.
…….Opponent chooses 3.
Total value collected by user is 15(8 + 7)

2.
…….User chooses 7.
…….Opponent chooses 8.
…….User chooses 15.
…….Opponent chooses 3.
Total value collected by user is 22(7 + 15)

So if the user follows the second game state, maximum value can be collected although the first move is not the best.

There are two choices:
1. The user chooses the ith coin with value Vi: The opponent either chooses (i+1)th coin or jth coin. The opponent intends to choose the coin which leaves the user with minimum value.
i.e. The user can collect the value Vi + min(F(i+2, j), F(i+1, j-1) )
coinGame1

2. The user chooses the jth coin with value Vj: The opponent either chooses ith coin or (j-1)th coin. The opponent intends to choose the coin which leaves the user with minimum value.
i.e. The user can collect the value Vj + min(F(i+1, j-1), F(i, j-2) )
coinGame2

Following is recursive solution that is based on above two choices. We take the maximum of two choices.

F(i, j)  represents the maximum value the user can collect from 
         i'th coin to j'th coin.

    F(i, j)  = Max(Vi + min(F(i+2, j), F(i+1, j-1) ), 
                   Vj + min(F(i+1, j-1), F(i, j-2) )) 
Base Cases
    F(i, j)  = Vi           If j == i
    F(i, j)  = max(Vi, Vj)  If j == i+1

Why Dynamic Programming?
The above relation exhibits overlapping sub-problems. In the above relation, F(i+1, j-1) is calculated twice.


很有意思的博弈问题,重要的一点是贪心法在这里是不行的,前面已经举了反证。

另外很重要的一点是对求dp[0][n]而不是dp[m][m]的问题,如何写for循环。文章里说要从对角线开始向右上角递推。

比如:

The below table represents the stored values for the string abcde.

a b c d e
----------
0 1 2 3 4
0 0 1 2 3 
0 0 0 1 2 
0 0 0 0 1 
0 0 0 0 0

How to fill the table?
The table should be filled in diagonal fashion. For the string abcde, 0….4, the following should be order in which the table is filled:

Gap = 1:
(0, 1) (1, 2) (2, 3) (3, 4)

Gap = 2:
(0, 2) (1, 3) (2, 4)

Gap = 3:
(0, 3) (1, 4)

Gap = 4:
(0, 4)

可以用以下代码得到:

用一个gap变量作为l和h之间的距离,然后l和h一起前进,直到h碰到边界n,因为l在左上方,h在右下方,所以肯定h先碰到右边界!

// Fill the table
    for (gap = 1; gap < n; ++gap)
        for (l = 0, h = gap; h < n; ++l, ++h)
            table[l][h] = (str[l] == str[h])? table[l+1][h-1] :
                          (min(table[l][h-1], table[l+1][h]) + 1);



package DP;

public class OptimalGameStrategy {

	public static void main(String[] args) {
		int[] A = {8, 15, 3, 7};
		int[] B = {2, 2, 2, 2};
		int[] C = {20, 30, 2, 2, 2, 10};
		System.out.println(optimalStrategyOfGameRec(A, 0, A.length-1));
		System.out.println(optimalStrategyOfGame(A, A.length));
		System.out.println(optimalStrategyOfGameRec(B, 0, B.length-1));
		System.out.println(optimalStrategyOfGame(B, B.length));
		System.out.println(optimalStrategyOfGameRec(C, 0, C.length-1));
		System.out.println(optimalStrategyOfGame(C, C.length));
		
	}
	
	
	public static int optimalStrategyOfGameRec(int[] A, int begin, int end){
		if(begin == end){		// 只剩下一枚硬币时,只能取那枚
			return A[begin];
		}
		if(begin+1 == end){	// 只剩下两枚时,取大的那枚
			return Math.max(A[begin], A[end]);
		}
		
		// 如果我去开头那枚,因为对手会拿较大那枚,所以留下的是较小的选择,看图
		int a = A[begin] + Math.min(optimalStrategyOfGameRec(A, begin+2, end), 
											   optimalStrategyOfGameRec(A, begin+1, end-1));
		// 如果我去拿结尾那枚,同理
		int b = A[end] + Math.min(optimalStrategyOfGameRec(A, begin+1, end-1), 
											 optimalStrategyOfGameRec(A, begin, end-2));
		return Math.max(a, b);		// 做最合算的选择
	}
	
	
	// Returns optimal value possible that a player can collect from
	// an array of coins of size n. Note than n must be even
	public static int optimalStrategyOfGame(int[] A, int n){
		int[][] dp = new int[n][n];	//dp[begin][end]保存从序号为begin到end的coin序列能取得的最大值
		
		// Fill table using above recursive formula. Note that the table
	    // is filled in diagonal fashion (similar to http://goo.gl/PQqoS),
	    // from diagonal elements to table[0][n-1] which is the result.
		for(int gap=0; gap<n; gap++){
			int begin=0, end=gap;
			while(end < n){
				// 检测条件为右上角
				int x = begin+2<=end ? dp[begin+2][end] : 0;
				int y = begin+1<=end-1 ? dp[begin+1][end-1] : 0;
				int z = begin<end-2 ? dp[begin][end-2] : 0;
				
				dp[begin][end] = Math.max(A[begin]+Math.min(x, y), 
										   A[end]+Math.min(y, z));
				begin++;
				end++;
			}
		}
		
		return dp[0][n-1];
	}

}


http://www.geeksforgeeks.org/dynamic-programming-set-31-optimal-strategy-for-a-game/

http://www.geeksforgeeks.org/dynamic-programming-set-28-minimum-insertions-to-form-a-palindrome/

inferCNVpy分析流程学习 inferCNV的用途大家都已经很清楚了,接下来就走一下流程,试一试Python版的inferCNV。使用的数据集为:GSE188711,既往推文可见:Scanpy分析全流程(含harmonypy整合/细胞周期矫正/双细胞检测及去除)( 阅读详情

相关推荐

手把手教你用Simulink搭建交流异步电机矢量控制模型(附完整仿真文件)

本文提供了一份详细的Simulink仿真指南,手把手教你从零开始搭建交流异步电机矢量控制模型。内容涵盖主电路搭建、坐标变换实现、双闭环PI调节器设计、转子磁链观测器调试等核心步骤,并附有完整的仿真文件,帮助读者跨越理论到实践的鸿沟,掌握高性能电机控制系统的建模与仿真技能。

pz890123的博客 665

动态规划十大经典案例(Dynamic Programming Practice Problems)

动态规划(Dynamic Programming)是求多阶段决策过程(Multistep Decision Process)最优化的一种数学方法,它将问题的整体按时间或空间的特征分成若干个前后衔接的时空阶段,把多阶段决策问题表示为前后有关的一系列单阶段决策问题,然后逐个求解,从而求出整个问题的最有决策序列。它强调了时间和空间的连续性。 如果没有基础知识,建议参看关文忠教授(退休)的运筹学课程中了...

mr2zhang的博客 7339

MCP详解:手把手教你理解和如何使用各种开源MCP服务

MCP 作为一种开放协议,为 AI 模型与外部世界的连接提供了标准化的解决方案。它不仅降低了开发门槛,还极大地扩展了 AI 应用的边界。无论是开发者还是普通用户,都可以通过 MCP 更高效地利用 AI 技术,实现更多智能化的功能。

王哥儿聊AI的博客 6055

DP概述和常见DP面试题 --算法竞赛专题解析(11)

DP的概念和基本操作;DP的设计、方程推导、记忆化编码、递推编码、滚动数组;常见的DP面试题。

罗勇军的博客 1万+

直流无刷电机FOC控制算法 理论到实践 —— 实践

关于直流无刷电机FOC控制算法的理论章节,本人已经在前两章进行过详细说明,大家可以自行进行阅读,请务必了解过理论之后再来学习如何具体进行实现。直流无刷电机FOC控制算法 理论到实践 —— 理论(一)直流无刷电机FOC控制算法 理论到实践 —— 理论(二)本章节主要讨论采用MCU微控制器如何具体实现直流无刷电机的FOC控制。

爱出名的狗腿子 1万+

【软件定义汽车】-【架构篇】-全面讲解整车电子电气架构演进

前言: 前段时间,陆陆续续写了一些电子电气架构相关的文章。这里打算再写最后一篇作为收尾,为整个系列画上句号,把坑填上,这个话题就算过去了。后续一段时间,尽量把之前文章中挖的“坑”填一下。行文逻辑将借鉴5W2H进行。 另外,本文作为一篇整合性的文章,为保证逻辑的完整性,主要是将大量过去自己文章中的内容进行梳理整合,也存在很多行业内专家的公开文章的内容,请见谅。 WHAT1:什么是汽车电子电气架构? 电子电气架构:EEA,Electrical/Electronic Architecture.

零点壹客的博客 1万+

【题解】麻将游戏

题目描述   在一种“麻将”游戏中,游戏是在一个有W×H格子的矩形平板上进行的。每个格子可以放置一个麻将牌,也可以不放(如图所示)。玩家的目标是将平板上的所有可通过一条路径相连的两张相同的麻将牌,从平板上移去。最后如果能将所有牌移出平板,则算过关。   这个游戏中的一个关键问题是:两张牌之间是否可以被一条路径所连接,该路径满足以下两个特性:   1、它由若干条线段组成,每条线段要么是...

weixin_30832983的博客 880

060、模型蒸馏:把扩散模型压进单步的魔法

《端侧文生图模型蒸馏实战:从32步到1步的优化之道》摘要:针对边缘设备部署难题,本文分享了扩散模型蒸馏的核心经验。通过重构损失函数(感知损失+对抗训练+KL散度)、优化采样轨迹截取策略和改造学生模型架构,成功将Stable Diffusion压缩至单步推理。关键发现包括:小批量训练更有效、标签平滑保障生成多样性、双模型策略平衡质量与速度。在Cortex-A53芯片上实现300ms内生成,内存占用控制在200MB以下。特别强调工业部署需权衡压缩率与稳定性,建议保留迭代模式开关以适配不同场景需求。

2601_95651806的博客 150

dp=[[0]*n]*m 和dp = [[0] * n for _ in range(m)]的区别是什么?

这种方式创建了一个包含 m 行和 n 列的二维列表 dp,并将每一行都初始化为相同的列表(即 [0] * n)。这种方式创建了一个包含 m 行和 n 列的二维列表 dp,但每一行都是由一个独立的列表对象组成,而不是共享相同的列表。例如,如果您执行 dp[0][0] = 1,那么 dp[1][0]、dp[2][0] 等等都将变为 1,因为它们都指向相同的列表对象。例如,如果您执行 dp[0][0] = 1,只有 dp[0][0] 的值会变为 1,其他行不受影响。

redfishzhang64的博客 644

Vue - 解决报错 Error: Cannot find module ‘XXX\@vue\cli-service\bin\vue-cli-service.js‘(vue项目编译运行出错,启动失败)

vue报错,Error: Cannot find module ‘@vue\cli-service\bin\vue-cli-service.js‘,vue2项目启动报错,vue3项目运行出错,vue执行npm run serve报错,找不到@vue/cli-service模块,vue项目关于:Error: Cannot find module ‘D:\@vue\cli-service\bin\vue-cli-service.js‘的解决方案,vue项目跑不起来了,Vue项目报错,跑项目报错Cannot fi

🏆 前端领域优质创作者 3115

DeepSeek+即梦:AI视频创作从0到1全突破

本文为 DeepSeek 与即梦生成视频全攻略,从前期注册登录、熟悉工具界面及硬件网络准备入手,助读者开启 AI 视频创作。详细阐述利用 DeepSeek 构思脚本、即梦实现画面生成与静态图转动态视频的方法,包括提示词编写、参数调整等技巧。同时介绍后期合成音画、添加字幕特效及多平台适配要点,结合实战案例解析全流程。还分享进阶提示词优化、版权注意等避坑指南,为创作者提供从 0 到 1 的 AI 视频创作完整解决方案。

邓邓子的博客 8105

动态规划时注意初始化dp的方式

采用 dp1 = [[1 for _ in range(n)] for _ in range(m)] 如果采用 dp = [[0] * n] * m 虽说形式上没什么不同,但是给给值得时候会出问题,所以要用第一个代码的形式

少游 868

k8s上分离集群seatunnel部署(生产推荐)

k8s上分离集群seatunnel部署(生产推荐)

寂夜了无痕的博客 886

DP31 取大小游戏中的最优策略(附:如何对DP[0][n]进行对角线递推) Optimal Strategy for a Game @geeksforgeeks...

Problem statement: Consider a row of n coins of values v1 . . . vn, where n is even. We play a game against an opponent by alternating turns. In each turn, a player selects either the first or las...

系统 运维 485

Statistics and Machine Learning Toolbox

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

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

`dp = [[0] * n for _ in range(m)]` 和 `dp = [[0] * n] * m` 区别

的方式中,所有行实际上是相同的对象,它们共享相同的内存。这可能会导致不符合预期的结果,尤其在修改元素时会出现问题。创建的二维数组在操作上有重要的区别,主要涉及到内存引用和更新的方式。的方式来创建独立的二维数组,以确保在操作中每行都是独立的。

weixin_54707168的博客 663

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

算法:动态规划(其他dp)

计数dp: leetcode413.等差数列划分 class Solution: def numberOfArithmeticSlices(self, nums: List[int]) -> int: #dp[i]表示以num[i]结尾的等差数列的个数,可以看出dp[i]可以从dp[i-1]推来, #例如:[1,2,3]---dp[2]=1而[1,2,3,4]以4结尾的等差数列个数为dp[3]=2, #一个是dp[2]的延续,个数即d.

English_yang的博客 536

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

小白学DP(动态规划)

动态规划刷题笔记动态规划概念自顶向下的备忘录法自底向上的动态规划例题区域和检索-数组不可变使用最小花费爬楼梯小白上楼梯(三步问题)小白上楼梯2最大字段和最长公共子串最长公共子序列最长递增子序列 动态规划 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 1453

小白的动态规划学习

这是我在学习动态规划时,在力扣刷题的总结。参考了很多大佬的题解、总结。 包括但不限于: 动态规划系列 力扣加加动态规划 《算法笔记》 《LeetCode 101》 解题思考方法 确定dp数组(dp table)以及下标的含义 确定递推公式 dp数组如何初始化 确定遍历顺序 举例推导dp数组 一维动态规划 509. 斐波那契数 初始值 看在不在备忘录里 递推公式 返回值 def fib(self, n): memo={} def dfs(n):

weixin_44204511的博客 492

C Optimal Strategy(数论,费马小定理)

这道题目就是一个贪心+动态规划的题目,和队友做了好久没做出来,后来看的大佬的题解,就是如果当前价值最大的是奇数的话,那就一定先拿最大的,如果是偶数的话,可以随便拿,但是一旦你前面的人拿了最大的,你就一定要也跟着拿最大的,否则就会输,所以就是两个相同价值的一定要成对出现,这样的话,我们从最小的开始(因为最小的话,拿的顺序其实是个全排列,这个既然都是最小了就不在意谁先拿谁后拿,反正都要拿走), 然后在这个的基础上,每增加一个就添加进一个n对(可以有单)的排列组合,以此类推,直到排列完最后一种数字。

weixin_73529240的博客 562

[Algorithm] Dynamic Programming

Question 1. Problem statement: Consider a row of n coins of values v1 . . . vn, where n is even. We play a game against an opponent by alternating turns. In each turn, a player selects either the fi...

weixin_30872671的博客 144

C Optimal Strategy 详解 【组合数学】【2021-ACM-ICPC-济南站】

刚打完的icpc济南站的C题 Optimal Strategy 比赛时没A出来,思路在比赛时是想对了.但还在想是个dp题,推式子题还是模拟题哈哈.好菜啊. 一般这种大数取模的就得推式子,找规律啥的.今天补了c题,题面如下 (一)题目大意 输入n,再输入n个数.E和M轮流取一个数使各自取到的数字总和最大,E和M都足够聪明.问取数的过程有几种. (二)思路分析 要让和最大,自然想到每个数都不能太小.若直接贪心每次双方都取最大第一个样例都解释不通. 再模拟样例二发现暗示比较明显,每个数都出现偶数次,样例三便是奇

m0_57050876的博客 1613

leetcode 21天打卡 17 猜数字大小

要求: 我们正在玩一个猜数游戏,游戏规则如下: 我从1到 n 之间选择一个数字。 你来猜我选了哪个数字。 如果你猜到正确的数字,就会 赢得游戏 。 如果你猜错了,那么我会告诉你,我选的数字比你的 更大或者更小 ,并且你需要继续猜数。 每当你猜了数字 x 并且猜错了的时候,你需要支付金额为 x 的现金。如果你花光了钱,就会 输掉游戏 。 给你一个特定的数字 n ,返回能够 确保你获胜 的最小现金数,不管我选择那个数字 。 代码: class Solution(object): def g..

just_so_so6的博客 2411

最佳适配策略_游戏的最佳策略

最佳适配策略Description: 描述: This is a very popular interview problem to find maximum outcomes in a two player game played in an optimal way. This problem has been featured in interview rounds of Amazon, ...

cumubi7552的博客 362

hdu 3951 - Coin Game(找规律)

这道题是有规律的博弈题目,,, 所以我们只需要找出规律来就ok了 牛人用sg函数暴力找规律,菜鸟手工模拟以求规律。。。【牢骚】 if(m>=2) { if(n else {first无法一口吃掉所有的,所以second成了主动的了,如果first第一口吃掉k1个,那么明智的second只要吃掉k2个就可以了(n-k1-k2是偶数,也包括 0的),使得 剩下的数字是分成两个数字数目相等

稻草人 727

Coin Game HDU - 3951(博弈 思维)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3951 题意:两个玩家用一圈N硬币开始游戏。他们轮流从圆圈里取硬币,每次可以取1~k个连续的硬币。 (假设10个硬币从1到10,k等于3,因为1和10是连续的,你可以拿走连续的10、1、2,但是如果2被拿走,你不能拿走1、3、4,因为1和3不是连续的)。拿最后一枚硬币的玩家获胜。 思路:当一次能取完时,...

呼吸 787

2021 ICPC Jinan C Optimal Strategy

C Optimal Strategy 先从游戏分析: 1、如果当前情况为:物品中最大值 A_max 的个数 C(A_max) 为奇数,那么此回合玩家是一定要拿 A_max 的,并将 C(A_max) 变为偶数传给对方。此后,单考虑值为 A_max 的物品,该玩家一定会比对手多拿一次,符合最优情况。 2、若当前物品中最大值 A_max 的个数 C(A_max) 为偶数, 显然,双方都遵循以下最优决策: ①上一轮对手拿了一次 A_max , 此回合我必须也拿A_max(如果还能拿A_max的话)。 ①上一轮对

自伤无色的博客 4135
上一篇: DP30 求骰子能凑成给定和的组合数 Dice Throw @geeksforgeeks
下一篇: DP32 单词按照字典分割问题 Word Break Problem @geeksforgeeks
chiiis
博客等级 码龄14年 422粉丝 429原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值