题目链接

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. ETL作业调度软件TASKCTL4.1集群部署

    熟悉TASKCTL4.1一段时间后,觉得它的调度逻辑什么的都还不错,但是感觉单机部署不太够用.想实现跨机调度作业,就要会TASKCTL的集群部署.下面就是我在网上找到的相关资料,非原创. 单机部署成功 ...

  2. Nlpir Parser智能语义平台全文搜索

    全文索引用于处理大文本集合,利用它人们可以在海量文本中快速获取需要的信息.全文检索系统是按照全文检索理论建立起来的用于提供全文检索服务的软件系统.一般来说,全文检索需要具备建立索引和提供查询的基本功能 ...

  3. nginx响应高并发参数配置

    一.一般来说nginx 配置文件中对优化比较有作用的为以下几项: 1.  worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu ...

  4. 13. leetcode 453. Minimum Moves to Equal Array Elements

    Given a non-empty integer array of size n, find the minimum number of moves required to make all arr ...

  5. ORA-01031:insufficient privileges解决方法

    今天刚创建的数据库,用sys身份登录的时候提示 ORA-01031:insufficient privileges !郁闷了,肯定是先百度一波···然后设置当前用户权限.用Administator用户 ...

  6. LVS-负载均衡集群部署

    简介:LVS是一种集群技术,采用IP负载均衡技术和基于内容请求分发技术,调度器具有很好的吞吐量,将请求均衡的转移到不同服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能,高可 ...

  7. java中Comparable和Comparator两种比较器的区别

    Comparable和Comparator接口都是为了对类进行比较,众所周知,诸如Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较 ...

  8. python中的赋值和深浅拷贝

    python中,A object  = B object  是一种赋值操作,赋的值不是一个对象在内存中的空间,而只是这个对象在内存中的位置 . 此时当B对象里面的内容发生更改的时候,A对象也自然而然的 ...

  9. 【NO.2】Jmeter-安装Jmeter - 在Linux环境安装Jmeter - 在Windows环境安装Jmeter

    当配置完Jmeter运行的环境之后,就可以开始安装Jmeter了. 为什么既要告诉各位"在Linux系统内安装Jmeter",又要告诉各位"在Windows系统内安装Jmeter"?因为当我们在构建1 ...

  10. Vue2.0父子组件之间和兄弟组件之间的数据交互

    熟悉了Vue.js的同级组件之间通信,写此文章,以便记录. Vue是一个轻量级的渐进式框架,对于它的一些特性和优点,请在官网上进行查看,不再赘述. 使用NPM及相关命令行工具初始化的Vue工程,目录结 ...