【HDU6199 2017 ACM ICPC Asia Regional Shenyang Online F】【博弈 DP】gems gems gems 双人从左侧拿宝石 每次拿相同或加一的最小差值

原创 2017年09月13日 09:47:54

gems gems gems

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1172    Accepted Submission(s): 242


Problem Description
Now there are n gems, each of which has its own value. Alice and Bob play a game with these n gems.
They place the gems in a row and decide to take turns to take gems from left to right. 
Alice goes first and takes 1 or 2 gems from the left. After that, on each turn a player can take k or k+1 gems if the other player takes k gems in the previous turn. The game ends when there are no gems left or the current player can't take k or k+1 gems.
Your task is to determine the difference between the total value of gems Alice took and Bob took. Assume both players play optimally. Alice wants to maximize the difference while Bob wants to minimize it.
 

Input
The first line contains an integer T (1T10), the number of the test cases. 
For each test case:
the first line contains a numbers n (1n20000);
the second line contains n numbers: V1,V2Vn. (100000Vi100000)
 

Output
For each test case, print a single number in a line: the difference between the total value of gems Alice took and the total value of gems Bob took.
 

Sample Input
1 3 1 3 2
 

Sample Output
4
 

Source

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
#define MS(x, y) memset(x, y, sizeof(x))
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b > a)a = b; }
template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b < a)a = b; }
const int N = 2e4 + 10, M = 0, Z = 1e9 + 7, inf = 0x3f3f3f3f;
template <class T1, class T2>inline void gadd(T1 &a, T2 b) { a = (a + b) % Z; }
int casenum, casei;
int n;
int sum[N];
int v[N];
int f[N][202];
int main()
{
	scanf("%d", &casenum);
	for (casei = 1; casei <= casenum; ++casei)
	{
		scanf("%d", &n);
		for (int i = n; i >= 1; --i)scanf("%d", &v[i]);
		for (int i = 1; i <= n; ++i)sum[i] = sum[i - 1] + v[i];

		//设m为最大能取到的数量,则有(1+m)*m<=n*2,得到m^2+m<=n*2,得到m<sqrt(n*2)
		int m = sqrt(n * 2);
		while ((1 + m) * m > n * 2)--m;

		for (int i = 1; i <= n; ++i)//枚举当前还剩下几个
		{
			int top = min(i, m);
			for (int j = 1; j <= top; ++j)//枚举上一轮的人拿了多少个
			{
				f[i][j] = -2e9;
				gmax(f[i][j], (sum[i] - sum[i - j]) - f[i - j][j]);							//这一轮拿一样多
				if(i > j)gmax(f[i][j], (sum[i] - sum[i - j - 1]) - f[i - j - 1][j + 1]);	//这一轮多拿一个
			}
		}
		printf("%d\n", f[n][1]);
	}
	return 0;
}
/*
【题意】
有n(2e4)个宝石
两个人轮流从左侧取宝石,Alice先手,首轮取1个或2个宝石,
如果上一轮取了k个宝石,则这一轮只能取k或k+1个宝石。
一旦不能再取宝石就结束。
双方都希望自己拿到的宝石数比对方尽可能多。
问你,先手比后手多拿的最大宝石数。

【分析】
我们用f[i][j]表示剩下i和宝石没取,上个人取了j个宝石,先手所能获得的最大宝石价值差。
则我们此时,如果可i>=j(或i>=j+1),则可以选择拿j或j+1个宝石,对应着f[i-k][k]的后继,有gmax(f[i][j], (sum[i]-sum[i-k]) - f[i-k][k])

1,所有非法状态,都以0为初始值即可
2,每个v最多使得绝对值偏差1e5,所以int即可保存所有状态

【时间复杂度&&优化】
O(nsqrt(n))

*/


版权声明:题解中哪里写错请一定要指出来QwQ 转载还请注明下出处哦,谢谢^_^

2016 ACM/ICPC Asia Regional Shenyang Online

B 题意:树上的两个操作 一、对路径上的边权进行修改 二、求路径上边权连续的段数 思路:树链剖分操作,小心边界。 #pragma comment(linker, "/STACK:1024...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2016年09月30日 20:23
  • 519

2017 ACM/ICPC Asia Regional Shenyang Online

2017 ACM/ICPC Asia Regional Shenyang Online1004
  • Dorlife
  • Dorlife
  • 2017年09月10日 12:04
  • 1325

HDU 6199 gems gems gems (DP, 2017 ACM/ICPC Asia Regional Shenyang Online)

ProblemNow there are n gems, each of which has its own value. Alice and Bob play a game with these n...
  • DorMOUSENone
  • DorMOUSENone
  • 2017年09月11日 09:01
  • 1238

HDU 5461 Largest Point(关键在于最值)——2015 ACM/ICPC Asia Regional Shenyang Online

HDU 5461 Largest Point(关键在于最值)——2015 ACM/ICPC Asia Regional Shenyang Online
  • queuelovestack
  • queuelovestack
  • 2015年09月19日 19:00
  • 645

HDU 5476 Explore Track of Point 几何题 —— 2015 ACM/ICPC Asia Regional Shanghai Online

HDU 5476 Explore Track of Point 2015上海网络赛 几何题标签: 解题报告 几何题目见HDU 5476给出等腰三角形ABC,AB=AC,M为BC中点。P点为三角形内使m...
  • Baileys0530
  • Baileys0530
  • 2015年09月26日 19:06
  • 1906

2014 ACM/ICPC Asia Regional Xi'an Online

记得去年比网络赛的时候写了这场比赛,我和李思辰写的,最终一一题之差很遗憾未能进入region 1001 即 HDU 5007 Post Robot 题意大致是说,给你多个单词,对于每个单词,如果含...
  • u013615904
  • u013615904
  • 2015年09月06日 07:21
  • 226

2013 ACM/ICPC Asia Regional Nanjing Online

2013 ACM/ICPC Asia Regional Nanjing Online  Area Time Limit: 2000/1000 MS (Java/Others)    Memor...
  • chao1983210400
  • chao1983210400
  • 2013年09月21日 17:54
  • 1306

hdu 5014 Number Sequence 2014 ACM/ICPC Asia Regional Xi'an Online 数论

题目链接:hdu 5014         给出
  • u010535824
  • u010535824
  • 2014年09月14日 18:49
  • 346

【2016 ACM/ICPC Asia Regional Qingdao Online】

[ HDU 5878 ] I Count Two Three 考虑极端,1e9就是2的30次方,3的17次方,5的12次方,7的10次方。 而且,不超过1e9的乘积不过5000多个,于是...
  • amazingcode
  • amazingcode
  • 2016年09月25日 09:06
  • 129

2017沈阳网络赛 HDU 6199 gems gems gems

题意 : 两个人轮流拿物品,每一个物品都有一个价值,第 i 次拿 k 个那么 第 i + 1 次 可以拿 k + 1 或者 k 个。每个人都采取最有策略问你最后两个人的差。 题解 : 首先我们发现每一...
  • zhelong3205
  • zhelong3205
  • 2017年09月11日 20:33
  • 233
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【HDU6199 2017 ACM ICPC Asia Regional Shenyang Online F】【博弈 DP】gems gems gems 双人从左侧拿宝石 每次拿相同或加一的最小差值
举报原因:
原因补充:

(最多只允许输入30个字)