算法 预测赢家(动态规划)

这篇具有很好参考价值的文章主要介绍了算法 预测赢家(动态规划)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

题目链接

给你一个整数数组 nums 。玩家 1 和玩家 2 基于这个数组设计了一个游戏。

玩家 1 和玩家 2 轮流进行自己的回合,玩家 1 先手。开始时,两个玩家的初始分值都是 0 。每一回合,玩家从数组的任意一端取一个数字(即,nums[0] 或 nums[nums.length - 1]),取到的数字将会从数组中移除(数组长度减 1 )。玩家选中的数字将会加到他的得分上。当数组中没有剩余数字可取时,游戏结束。

如果玩家 1 能成为赢家,返回 true 。如果两个玩家得分相等,同样认为玩家 1 是游戏的赢家,也返回 true 。你可以假设每个玩家的玩法都会使他的分数最大化。

算法 预测赢家(动态规划)
算法 预测赢家(动态规划)


一、题意解析

两个值的时候必然是取较大的,三个值,取一个能使自己分数和最大的,后手必然留较小的给先手,因
此先手选一个值加上该较小值最大化。

由于"每个玩家的玩法都会使他的分数最大化",所以先手后手玩家的策略方式是一样的,只是先后次序不同而已。

先手选的值,应该比后手能选的值,达到"差值最大"的效果;
同理,后手选的值也会尽量比下一次先手选的值,达到"差值最大"的效果;
即:决策代码是一致的。

int maxscore(int* nums, int left, int right)
{
	if (left == right)
	{
		return nums[left];
	}

	int sleft = nums[left] - maxscore(nums, left + 1, right);
	int sright = nums[right] - maxscore(nums, left, right - 1);

	return sleft >= sright ? sleft : sright;
}

bool PredictTheWinner(int* nums, int numsSize)
{
	return maxscore(nums, 0 ,numsSize - 1) >= 0;
}

二、动态规划

乔治·桑塔亚纳说过,“那些遗忘过去的人注定要重蹈覆辙。”这句话放在问题求解过程中也同样适用。不懂动态规划的人
会在解决过的问题上再次浪费时间,懂的人则会事半功倍。

一种可以用动态规划解决的情况就是会有反复出现的子问题,然后这些子问题还会包含更小的子问题。相比于不断尝试去解决这些反复出现的子问题,动态规划会尝试一次解决更小的子问题。之后我们可以将结果输出记录在表格中,我们在之后的计算中可以把这些记录作为问题的原始解。

以下是两种不同的动态规划解决方案:

自上而下:你从最顶端开始不断地分解问题,直到你看到问题已经分解到最小并已得到解决,之后只用返回保存的答案即可。这叫做记忆存储(Memoization)。

自下而上:你可以直接开始解决较小的子问题,从而获得最好的解决方案。在此过程中,你需要保证在解决问题之前先解决子问题。这可以称为表格填充算法(Tabulation,table-filling algorithm)。

动态规划是逐一解决小问题,最终可以得到大问题答案的解决方案。

1)假设只有1个整数,先手后手的最大差值就是这个唯一的整数;

2)假设只有2个整数,先手后手的最大差值应该是:
先手尽量取最大值,后手在剩下的数中尽量去最大值,然后两数相减得到最大差值

3)假设有3个整数,先手尽量取一个最大值,后手也会在剩下2个数中,确保后手尽可能大,
即:后手保证在剩下2个数中,达到最大差值的效果。因此可以利用2)的方法。

4)假设有4个整数,方法同3)。先手尽量取一个最大值,后手在剩下3个数中,
确保后手尽可能大。因此可以利用3)的方法。

因此,要求数组中索引 0 到 length 的最大差值,我们需要这么做:

1)想求[0, length]范围的最大差值, 需求出数组范围比[0, length]小1 的最大差值;
2) 想求[0, length]小1 范围的最大差值, 需求出数组范围比[0, length]小2 的最大差值;
3) 想求[0, length]小2 范围的最大差值, 需求出数组范围比[0, length]小3 的最大差值;文章来源地址https://www.toymoban.com/news/detail-400554.html

//使用一个dp数组, 保存 i,j 之间 "先后手的最大差值";因此需要定义 dp[][];
//dp[left][right] = max(nums[left] - dp[left+1][right], num[right] - dp[left][right-1])
//dp数组的初始值应该是 left == right时, dp[left][left] = nums[left]
//dp[0][length]的意义: 整个数组先手后手的最大差值。
//dp[0][length] = max(nums[0] - dp[1][right], num[length] - dp[0][length-1])
int max(int a, int b)
{
	return a > b ? a : b;
}

bool PredictTheWinner(int* nums, int numsSize)
{
	int dp[numsSize][numsSize];

	for (int i = 0; i < numsSize; i++)
	{
		dp[i][i] = nums[i];
	}

	for (int left = numsSize - 2; left >= 0; left--)
	{
		for (int right = left + 1; right < numsSize; right++)
		{
			dp[left][right] = max(nums[left] - dp[left+1][right], nums[right] - dp[left][right-1]);
		}
	}

	return dp[0][numsSize - 1] >= 0;
}

到了这里,关于算法 预测赢家(动态规划)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 动态规划2:题目

    动态规划2:题目

    目录 第1题 Fibonacci 第2题 字符串分割(Word Break) .第3题 三角矩阵(Triangle) 第4题 路径总数(Unique Paths) 第5题 最小路径和(Minimum Path Sum) 第6题 背包问题 第7题 回文串分割(Palindrome Partitioning) 第8题 编辑距离(Edit Distance) 第9题 不同子序列(Distinct Subsequences) 分析问题: 1. 状态定义F(i):第

    2024年02月06日
    浏览(23)
  • 【LeetCode】动态规划类题目详解

    【LeetCode】动态规划类题目详解

    所有题目均来自于LeetCode,刷题代码使用的Python3版本 如果某一个问题有重叠的子问题,则使用动态规划进行求解是最有效的。 动态规划中每一个状态一定是由上一个状态推导出来的,这一点区别于贪心算法 动态规划五部曲 确定dp数组以及下标的含义 确定递推公式 dp数组如何

    2024年04月11日
    浏览(13)
  • 代码随想录 动态规划-基础题目

    代码随想录 动态规划-基础题目

    目录 509.斐波那契数  70.爬楼梯 746.使用最小花费爬楼梯 62.不同路径 63.不同路径|| 343.整数拆分 96.不同的二叉树 509. 斐波那契数 简单 斐波那契数  (通常用  F(n)  表示)形成的序列称为  斐波那契数列  。该数列由  0  和  1  开始,后面的每一项数字都是前面两项数字的和

    2024年03月18日
    浏览(18)
  • 一维动态规划经典力扣题目(一)

    一维动态规划经典力扣题目(一)

    目录 题一:斐波那契数列 题目二:最低票价 题三:解码方法 递归方法是2的n次方的时间复杂度。 递归代码: 带有缓存的递归,会使时间复杂度得到大幅度优化。 时间复杂度为O(n)。 缓存即记录中间值         优化的方法:         代码:         代码:

    2024年02月21日
    浏览(14)
  • 计算机竞赛 题目:基于LSTM的预测算法 - 股票预测 天气预测 房价预测

    计算机竞赛 题目:基于LSTM的预测算法 - 股票预测 天气预测 房价预测

    🔥 优质竞赛项目系列,今天要分享的是 基于LSTM的预测算法 - 股票预测 天气预测 房价预测 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 时间序列预测是一类比较困难的预测问题。 与常见的回归预测

    2024年02月07日
    浏览(13)
  • 【leetcode 力扣刷题】回文串相关题目(KMP、动态规划)

    【leetcode 力扣刷题】回文串相关题目(KMP、动态规划)

    题目链接:5. 最长回文子串 题目内容: 题目就是要我们找s中的回文子串,还要是最长的。其实想想,暴力求解也行……就是遍历所有的子串,同时判断是不是回文串,是的话再和记录的最大长度maxlen比较,如果更长就更新。时间复杂度直接变成O(n^3)。 优化的点在于,假设子

    2024年02月09日
    浏览(12)
  • 题解动态规划:蓝桥杯2022国赛B组 题解 A题目

    题解动态规划:蓝桥杯2022国赛B组 题解 A题目

    在这组题(蓝桥杯C/C++ B组 国赛)里面挑了几道喜欢的题目,做了一下,笔记思路如下。( 其实是我觉得能做出的题 ) 题目图片来源于:CSDN 罚时大师月色 请问2022,拆分成10个不同的正整数有多少种不同的分法。 这道题目,拿到手上的时候,第一个想法是暴力,但是,每次

    2023年04月08日
    浏览(10)
  • 7-1 矩阵链相乘问题 (20 分)(思路+详解+题目解析) 动态规划做法

    7-1 矩阵链相乘问题 (20 分)(思路+详解+题目解析) 动态规划做法

    2:关于本题的矩阵乘法和递推方程的得出 3:实例演示 三:思路 =================================================================== 思路:这里在考虑的的时候,因为是多个矩阵相乘,求的最小乘法次数, 比如 A1_A2_A3_A4, 那么根据划分的不同,那么其乘法顺序也会不同,继而所求的乘法次数

    2024年04月09日
    浏览(31)
  • 解决背包衍生题目:单词拆分和分割等和子集--动态规划方式深度呈现

    解决背包衍生题目:单词拆分和分割等和子集--动态规划方式深度呈现

    目录 139. 单词拆分 解题思路 代码实现 416. 分割等和子集 二维动态规划 状态压缩(一维) 问题拓展 背包九讲知识总结 相关问题 题目描述 给你一个字符串  s  和一个字符串列表  wordDict  作为字典。请你判断是否可以利用字典中出现的单词拼接出  s  。 注意: 不要求字典中

    2024年02月03日
    浏览(12)
  • 【每日易题】Leetcode上Hard难度的动态规划题目——地下城游戏的实现

    【每日易题】Leetcode上Hard难度的动态规划题目——地下城游戏的实现

    君兮_的个人主页 即使走的再远,也勿忘启程时的初心 C/C++ 游戏开发 Hello,米娜桑们,这里是君兮_,博主最近一直在钻研动态规划算法,最近在Leetcode上刷题的时候遇到一个Hard难度的动态规划题,今天就借此机会来给大家分享一下我对这个题目的一些看法和解题思路(放心,

    2024年02月05日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包