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/

Greenplum基础 CREATE DATABASE 是 SQL 命令,用于创建一个新的数据库。name 是你要创建的数据库的名称。这个名称是必须的,并且在同一个数据库服务器上必须是唯一的。可选项,OWNER 指定了新数据库的所有者,如果未指定,新数据库的所有者默认是执行该命令的用户。dbowner 是数据库所有者的用户名。可选项,TEMPLATE 指定了用于创建新数据库的模板。在 PostgreSQL 和 GreenPlum 中,通常有一个名为 template1 的默认模板。如果不指定,就会使用这个默认模板。 阅读详情

相关推荐

【智能优化算法】2024年SCI鳗鱼-石斑鱼优化算法(EGO),含MathType公式、word伪代码、visio流程图、matlab代码等。

该文中包括5个内容:用MathType编辑的公式、伪代码、visio的流程图,matlab代码,PDF论文,拿来直接用,可以帮助科研者省下超多时间。 鳗鱼-石斑鱼优化算法(Eel and grouper optimizer ,EGO)是一种新型的元启发式算法(智能优化算法),灵感来源于海洋生态系统中鳗鱼和石斑鱼的共生作用和觅食策略。该成果由Ali Mohammadzadeh和Seyedali Mirjalili两位作者于2024年6月发表在SCI著名期刊《Cluster Computing》上。

2301_79359347的博客 1042

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

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

mr2zhang的博客 7339

cocos creator接入微信登陆sdk ios篇

cocos creator接入微信登陆sdk ios篇 背景已经在Android篇里面交代过了,有兴趣的朋友可以再看看Android篇 步骤 去微信开放平台下载ios平台所需要的sdk 在“info”标签栏的“URL type“添加“URL scheme”为你所注册的应用程序id 在“info”标签栏的“LSApplicationQueriesSchemes“添加weixin 将SDK文件中...

凤小鹿的博客 6362

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

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

罗勇军的博客 1万+

PD虚拟机安装CentOS7后必做的Parallels Tools配置指南(附常见错误解决)

本文详细指导在Mac的Parallels Desktop虚拟机中安装CentOS 7后如何高效配置Parallels Tools,包括环境准备、镜像挂载、依赖问题解决及性能优化。特别针对常见错误如挂载失败、依赖缺失等提供实用解决方案,帮助用户实现主机与虚拟机间的无缝交互和显示优化。

weixin_29288313的博客 300

2023 数字IC设计秋招复盘——数十家公司笔试题、面试实录

由于是本人的亲身经历,所以想通过付费专栏获得一些收益。扣除平台的抽成后,我会将最终收益的一半捐献给贫困山区助学基金。专栏内容: 1. 几十场笔试真题的原题纯净版与个人解答版。 2. 几十场面试实录,包含提问、解答与个人复盘建议。 3. 个人整理的知识点总结。 4. 求职准备、简历制作方面的建议。

w0shishabi的博客 1万+

【题解】麻将游戏

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

weixin_30832983的博客 880

循环神经网络(RNN)原理及BPTT算法

因循环神经网络基于ANN之上,理解ANN有助于理解RNN,所以阅读此文,建议先阅读。

L 1768

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

Open3D (C++) 计算点云坐标最值及其索引

使用C++版本的Open3D计算点云最值点及其对应的下标索引

点云侠的博客 728

C-08-实战:搭建一个AI客服机器人(接入微信企微)

客服是一人公司最大的时间杀手。本文教你搭建一个AI客服机器人,能自动回答80%的常见问题,只把复杂问题转给人工。含微信公众号和企业微信接入完整代码。

Johnny2004的专栏 88

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

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

少游 868

基于Java+SpringBoot+微信小程序实现奶茶点单系统

再不用担心逢年过节的第一杯奶茶有没有人送了,制作一个奶茶点单系统自己当店主,开怀畅饮,一劳永逸。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

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

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

廖雪峰Python教程[完整版]

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

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

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

weixin_54707168的博客 663

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

算法:动态规划(其他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

小白学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

麻将游戏(mahjong)题解

题目描述: 在一种"麻将"游戏中,游戏是在一个有w×h格子的矩形平板上进行的。每个格子可以放置一个麻将牌,也可以不放(如图所示)。玩家的目标是将平板上的所有可通过一条路径相连的两张相同的麻将牌,从平板上移去。最后如果能将所有牌移出平板,则算过关。 这个游戏中的一个关键问题是:两张牌之间是否可以被一条路径所连接,该路径满足以下两个特性: 1.它由若干条线段组成,每条线段要么是水平方向,要么是垂直方向。 2.这条路径不能横穿任何一个麻将牌 (但允许路径暂时离开平板)。 这是一个例子: 在(1,3

fzr1031的博客 3015
上一篇: 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、付费专栏及课程。

余额充值