题目链接

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 (1≤T≤10), the number of the test cases. 
For each test case:
the first line contains a numbers n (1≤n≤20000);
the second line contains n numbers: V1,V2…Vn. (−100000≤Vi≤100000)
 
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
 
 
题意:现在有n块宝石排成一行,价值为v[1~n]。 现在Alice和Bob 从左至右轮流取宝石,Alice先取,可以取1或2个,然后Bob取……如果前一个人取了k个,那么当前这个人只能取k或者k+1个宝石。(结束条件,如果前一个人取了k个宝石,而剩下的少于k个则停止不用取;如果剩余k个,那么这个人必须取k个),现在Alice和Bob都想得到的宝石价值和比对方尽量多,求Alice得到的价值和 - Bob得到的价值和的最大值?
 
思路:动态规划,定义dp[i][k][j], k取值0和1(0表示Alice取,1表示Bob取),i表示第i块宝石(1<=i<=20000),j表示从第i块宝石开始向右取j块宝石(1<=j<=200, 因为递增的取宝石,一个人一次最多取200块宝石),所以dp[i][k][j]表示取完i~n块宝石时(由后向前推),第k个人从i开始向右连续取k个宝石两人的价值差;
         另外,本题空间限制比较紧,所以需要使用滚动数组,第一维设为205即可。
 
代码如下:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
const int N=;
const int M=;
int sum[N];
int dp[M][][]; int main()
{
int T; cin>>T;
while(T--)
{
sum[]=;
memset(dp,,sizeof(dp));
int n; scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&sum[i]),sum[i]+=sum[i-];
for(int i=n;i>=;i--)
{
for(int j=;j<M;j++)
{
if(i+j->n) break; int tmp=sum[i+j-]-sum[i-], t;
if(i+j+j<=n) t=min(dp[(i+j)%M][][j],dp[(i+j)%M][][j+]);
else if(i+j+j-<=n) t=dp[(i+j)%M][][j];
else t=;
dp[i%M][][j]=tmp+t; if(i+j+j<=n) t=max(dp[(i+j)%M][][j],dp[(i+j)%M][][j+]);
else if(i+j+j-<=n) t=dp[(i+j)%M][][j];
else t=;
dp[i%M][][j]=t-tmp;
}
}
int ans;
if(n>=) ans=max(dp[][][],dp[][][]);
else ans=dp[][][];
printf("%d\n",ans);
}
return ;
}

hdu 6199 沈阳网络赛---gems gems gems(DP)的更多相关文章

  1. hdu 6194 沈阳网络赛--string string string(后缀数组)

    题目链接 Problem Description Uncle Mao is a wonderful ACMER. One day he met an easy problem, but Uncle M ...

  2. 2018 ICPC 沈阳网络赛

    2018 ICPC 沈阳网络赛 Call of Accepted 题目描述:求一个算式的最大值与最小值. solution 按普通算式计算方法做,只不过要同时记住最大值和最小值而已. Convex H ...

  3. 沈阳网络赛 F - 上下界网络流

    "Oh, There is a bipartite graph.""Make it Fantastic." X wants to check whether a ...

  4. 2017沈阳网络赛hdu6199 gems gems gems

    gems gems gems Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) P ...

  5. HDU 6199 2017沈阳网络赛 DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6199 题意:n堆石子,Alice和Bob来做游戏,一个人选择取K堆那么另外一个人就必须取k堆或者k+1 ...

  6. HDU 6200 2017沈阳网络赛 树上区间更新,求和

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6200 题意:给个图,有2种操作,一种是加一条无向边,二是查询u,v之间必须有的边的条数,所谓必须有的边 ...

  7. HDU 6203 2017沈阳网络赛 LCA,DFS+树状数组

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6203 题意:n+1 个点 n 条边的树(点标号 0 ~ n),有若干个点无法通行,导致 p 组 U V ...

  8. HDU 6205 2017沈阳网络赛 思维题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6205 题意:给你n堆牌,原本每一堆的所有牌(a[i]张)默认向下,每次从第一堆开始,将固定个数的牌(b ...

  9. HDU 6198 2017沈阳网络赛 线形递推

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6198 题意:给出一个数k,问用k个斐波那契数相加,得不到的数最小是几. 解法:先暴力打表看看有没有规律 ...

随机推荐

  1. POJ1975 Median Weight Bead floyd传递闭包

    Description There are N beads which of the same shape and size, but with different weights. N is an ...

  2. 3.commonjs模块

    1.首先建一个math.js exports.add = function(a, b){ return a + b; } exports.sub = function(a, b){ return a ...

  3. git分支管理之解决冲突

    人生不如意之事十之八九,合并分支往往也不是一帆风顺的. 准备新的feature1分支,继续我们的新分支开发: $ git checkout -b feature1 Switched to a new ...

  4. 神经网络中的BP神经网络和贝叶斯

    1 贝叶斯网络在地学中的应用 1 1.1基本原理及发展过程 1 1.2 具体的研究与应用 4 2 BP神经网络在地学中的应用 6 2.1BP神经网络简介 6 2.2基本原理 7 2.3 在地学中的具体 ...

  5. Python requests 安装与开发

    Requests 是用Python语言编写HTTP客户端库,跟urllib.urllib2类似,基于 urllib,但比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求, ...

  6. CSS3基础(3)——CSS3 布局属性全接触

    一. 弹性盒模型 1.弹性盒子模型介绍 弹性盒模型(Flexible Box或Flexbox)是一个CSS3新增布局模块,官方称为CSS Flexible Box Layout Module,用于实现 ...

  7. C#使用Xamarin开发可移植移动应用(3.进阶篇MVVM双向绑定和命令绑定)附源码

    前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 嗯..前面 ...

  8. ReactiveSwift源码解析(十一) Atomic的代码实现以及其中的Defer延迟、Posix互斥锁、递归锁

    本篇博客我们来聊一下ReactiveSwift中的原子性操作,在此内容上我们简单的聊一下Posix互斥锁以及递归锁的概念以及使用场景.然后再聊一下Atomic的代码实现.Atomic主要负责多线程下的 ...

  9. master log 与relay log的关系

    --master log 与relay log的关系 -------------------------------2014/06/09 Just to clarify, there are thre ...

  10. js 正则,从url中取参数值

    function getQueryString(name) { var reg = new RegExp(name +"=([^&]*)"); var r = window ...