两个马匪分金子

2024-05-11 02:18
文章标签 两个 金子 马匪分

本文主要是介绍两个马匪分金子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

解题思路

考虑先手和后手在序列a(1);a(2);…;a(n)上博弈:
* 如果先手取走了a1,那么问题转为两个人在a(2);a(3);…;a(n)上的博弈
* 如果先手取走了an,问题就变为了在a(1);a(2);…;a(n-1)上的博弈

假设,f(L,R)为两个人在序列a(L);a(L+1);…a(R)上博弈时,先手最多能拿到多少价值,此时后手拿到的
价值一定为:

总价值-f(L,R)

代码

非递归版本动态规划求解

int dp[555][555];
int sum[555];
int main(int argc, char* argv[])
{int nums = 0;while (cin >> nums){if (nums > 0){/*nums组测试数据*/for (int i = 0; i < nums; i++){int numsofdata;//一组数据的个数int input;int aValue = 0,bValue = 0;vector<int> ivec;cin >> numsofdata;for (int j = 0; j < numsofdata; j++){cin >> input;ivec.push_back(input);}if (ivec.size() != numsofdata)throw exception("Invalid Input");for (size_t k = 1; k <= ivec.size(); k++)sum[k] = sum[k-1]+ivec[k-1];for (int z = 1; z <= numsofdata; z++)dp[z][z] = ivec[z-1];for (int m = 1; m <= numsofdata - 1; m++){for (int n = 1; n + m <= numsofdata; n++){dp[n][n + m] = sum[n + m] - sum[n - 1] - min(dp[n][n + m - 1], dp[n + 1][n + m]);}}aValue = dp[1][numsofdata];cout << "Case # " << i + 1 << ":" << aValue << " " << sum[numsofdata] - aValue << endl;}}}

递归版本动态规划求解

int getGolds(vector<int>& golds, int sum)
{
#define MIN(a,b) (((a)>(b))?(b):(a))if (golds.size() == 1)return golds[0];int leftNum = golds[0];vector<int> goldsLeft(golds.begin() + 1, golds.end());int rightNum = golds[golds.size() - 1];vector<int> goldsRight(golds.begin(), golds.end() - 1);return sum - MIN(getGolds(goldsLeft, sum - leftNum), getGolds(goldsRight, sum - rightNum));}

这篇关于两个马匪分金子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/978232

相关文章

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

2024年AMC10美国数学竞赛倒计时两个月:吃透1250道真题和知识点(持续)

根据通知,2024年AMC10美国数学竞赛的报名还有两周,正式比赛还有两个月就要开始了。计划参赛的孩子们要记好时间,认真备考,最后冲刺再提高成绩。 那么如何备考2024年AMC10美国数学竞赛呢?做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。通过做真题,可以帮助孩子找到真实竞赛的感觉,而且更加贴近比赛的内容,可以通过真题查漏补缺,更有针对性的补齐知识的短板。

两个长数字相加

1.编程题目 题目:要实现两个百位长的数字直接相加 分析:因为数字太长所以无法直接相加,所以采用按位相加,然后组装的方式。(注意进位) 2.编程实现 package com.sino.daily.code_2019_6_29;import org.apache.commons.lang3.StringUtils;/*** create by 2019-06-29 19:03** @autho

创建一个大的DIV,里面的包含两个DIV是可以自由移动

创建一个大的DIV,里面的包含两个DIV是可以自由移动 <body>         <div style="position: relative; background:#DDF8CF;line-height: 50px"> <div style="text-align: center; width: 100%;padding-top: 0px;"><h3>定&nbsp;位&nbsp;

在二叉树中找到两个节点的最近公共祖先(基于Java)

如题  题解 public int lowestCommonAncestor(TreeNode root, int o1, int o2) {//记录遍历到的每个节点的父节点。Map<Integer, Integer> parent = new HashMap<>();Queue<TreeNode> queue = new LinkedList<>();parent.put(roo

Java中计算两个日期间隔多少天

String dbtime1 = "2017-02-23";  //第二个日期 String dbtime2 = "2017-02-22";  //第一个日期 //算两个日期间隔多少天 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Date date1 = format.parse(dbtime1); Date dat