轮流取数
来源:互联网 发布:手卷钢琴软件 编辑:程序博客网 时间:2024/06/08 01:36
完美世界笔试题
题目描述:有一正整数序列,两个人小萌和BOSS轮流从序列的任意一端取数,取得的数累加到积分,知道取完所有的分数。两个人取数都是最优策略,问最后两人得分。
如: 4 7 2 9 52
最后得分为:18 11
解题思路:这题是个博弈问题,每取一个数需要使得对方在剩下的数中得分最少。可以使用动态规划求解,状态转换方程为:
maxScore[i][j] = max(sumOfPreN[j] - sumOfPreN[i - 1] - maxScore[i][j - 1],
sumOfPreN[j] - sumOfPreN[i - 1] - maxScore[i + 1][j]);
maxScore[i][j] 为i终点为j中先取的人能拿到的最大分数,sumOfPreN[j]为前j个数的和。
代码:
#include<iostream>#include<vector>#include<algorithm>using namespace std;int main(){ int n; while (cin >> n) { vector<int> num(n + 1); vector<int> sumOfPreN(n + 1); vector<vector<int>> maxScore(n + 1, vector<int>(n + 1)); //保存i...j之间的所能得到的最大分数 for (int i = 1; i <= n; i++){ cin >> num[i]; sumOfPreN[i] = sumOfPreN[i - 1] + num[i]; maxScore[i][i] = num[i]; } for (int i = n - 1; i > 0; --i) { for (int j = i + 1; j <= n; ++j) { maxScore[i][j] = max(sumOfPreN[j] - sumOfPreN[i - 1] - maxScore[i][j - 1], //计算i到j之间的最大分数,思想是要使得拿出一个数后,后面取的从剩下的数组中得到的分数最少 sumOfPreN[j] - sumOfPreN[i - 1] - maxScore[i + 1][j]); } } cout << maxScore[1][n] << " " << (sumOfPreN[n] - maxScore[1][n]) << endl; }}
0 0
- 轮流取数
- 数组两边轮流取数,求谁和大
- 轮流取硬币
- 轮流拿(取)东西问题
- 【HDU6196 2017 ACM ICPC Asia Regional Shenyang Online C】【爆搜 + 剪枝】happy happy happy 爸爸儿子轮流两头取数 爸爸想输且输少
- 【杭电2015年12月校赛G】【map记录 状压DP 记忆化搜索实现 】Pick Game nm棋盘两人轮流取数 所取位置周围至少2个为空 为先手最大取得权值
- C语言取花生米(取棋子)系列问题。从一堆中轮流取的情况。
- 取数
- 21根火柴,每次取1-4根,人和计算机轮流取,保证计算机常胜,C/C++如何实现?
- 三个线程轮流输出ABC各十次(另附两个数组找相同的数若干种解法+两个线程轮流循环若干次)
- 随机取数
- 随机取数问题
- 取字符串字节数
- 1279 石子取数
- jquery 取字节数
- 取数游戏
- 随机取数问题
- 方格取数(1)
- 244_Math.Random使用
- day 14 Python Css padding
- java中的线程锁
- uvaLive 3942 Remember the Word 字典树
- 教师的免费公寓和博士的安家费
- 轮流取数
- 245_getColor方法过时
- 开始Linux安装
- wamp apache服务故障问题
- java编程思想读书笔记 第六章访问权限控制
- hrbust 2141 Watch Dogs【状压dp】
- 【hdu1166】敌兵布阵
- 【错误解决】[Maven]使用Maven配置Jstl出现异常:The absolute uri: http://java.sun.com/jsp/jstl/core cannot...
- MP3工作原理