HDU 6199 DP
gems gems gems
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1778 Accepted Submission(s): 424
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.
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)
题意:
Alice 和 Bob 玩游戏,有n堆宝石,每一堆都有价值,如果前一个人拿了k堆那么下一个人能够拿k堆或者k+1堆,两个人都希望自己拿到的价值与另一个人的差最大,求最后价值Alice-Bob,Alice可以先拿1堆或者2堆。
代码:
//看似博弈其实是dp,由于从第一个人开始并且他只能拿1或2堆,所以这是终结状态,从后向前推,设f[0/1][i][j]表示第1/2个人从第i堆开始拿并
//且上一个人拿了j堆的最优方案(Alice拿到的-Bob拿到的),每一个人又有两种拿法即j,j+1,所以处理一下前缀和转移方程就出来了。两个人都希
//望最优即第一个人希望(Alice-Bob)最大,第二个人希望(Bob-Alice)最大,我们可以把后一项看成(Alice-Bob)最小。
//因为k最大不超过200(2+4+...+k<=n),但是数组还是太大,要滚动数组。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MOD=;
int f[][][],sum[];
int main()
{
int t,n;
scanf("%d",&t);
while(t--){
sum[]=;
memset(f,,sizeof(f));
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<=;j++){
if(i+j<=n){
f[][i%MOD][j]=max(sum[i+j-]-sum[i-]+f[][(i+j)%MOD][j],sum[i+j]-sum[i-]+f[][(i+j+)%MOD][j+]);
f[][i%MOD][j]=min(sum[i-]-sum[i+j-]+f[][(i+j)%MOD][j],sum[i-]-sum[i+j]+f[][(i+j+)%MOD][j+]);
}else if(i+j-<=n){
f[][i%MOD][j]=sum[i+j-]-sum[i-]+f[][(i+j)%MOD][j];
f[][i%MOD][j]=sum[i-]-sum[i+j-]+f[][(i+j)%MOD][j];
}
}
}
printf("%d\n",f[][][]);
}
return ;
}
HDU 6199 DP的更多相关文章
- HDU 6199 DP 滚动数组
强行卡内存 这题在CF上好像有道极相似的题 可以想到状态设计为dp[f][i][k]表示f在取完i-1时,此时可以取k个或k+1个的状态下的最大值.之前以为n是1e5,自己想不到怎么设计状态真的辣鸡, ...
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- HDU 5928 DP 凸包graham
给出点集,和不大于L长的绳子,问能包裹住的最多点数. 考虑每个点都作为左下角的起点跑一遍极角序求凸包,求的过程中用DP记录当前以j为当前末端为结束的的最小长度,其中一维作为背包的是凸包内侧点的数量.也 ...
- HDU 6199 2017沈阳网络赛 DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6199 题意:n堆石子,Alice和Bob来做游戏,一个人选择取K堆那么另外一个人就必须取k堆或者k+1 ...
- hdu 6199 沈阳网络赛---gems gems gems(DP)
题目链接 Problem Description Now there are n gems, each of which has its own value. Alice and Bob play a ...
- hdu 6199 gems gems gems dp
gems gems gems Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) P ...
- HDU - 6199 gems gems gems (DP)
有n(2e4)个宝石两个人轮流从左侧取宝石,Alice先手,首轮取1个或2个宝石,如果上一轮取了k个宝石,则这一轮只能取k或k+1个宝石.一旦不能再取宝石就结束.双方都希望自己拿到的宝石数比对方尽可能 ...
- HDU 1069 dp最长递增子序列
B - Monkey and Banana Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I6 ...
- HDU 1160 DP最长子序列
G - FatMouse's Speed Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64 ...
随机推荐
- windows64系统下安装 redis服务 (详细)
Linux下Redis安装链接 : 转到 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表) ...
- react native中props的使用
react native中props的使用 一.props的使用 1:父组件传递的方式 在子组件中可以用this.props访问到父组件传递的值 <View> <Text> { ...
- 基于spec评论作品 - 探路者 贪吃蛇
基于spec评论作品,试用(并截图)所有其他小组的Alpha作品,与软件功能说明书对比,评论Alpha作品对软件功能说明书的实现. 首先通过命令行进入到游戏主页面中. 因为软件没有编译为exe程序,所 ...
- Access连接数据源配置(新手必知)
今天要连接Access时发现win7 64位旗舰版控制面板中管理工具下的数据源(ODBC)配置竟然只有SQLServer的驱动,其他的都没有了,这可不好玩!上网百度了一番,有人也遇过这样的问题,我在此 ...
- Java JVM多线程
- WebSphere应用服务器内存泄漏探测与诊断工具选择最佳实践
内存泄漏是比较常见的一种应用程序性能问题,一旦发生,则系统的可用内存和性能持续下降:最终将导致内存不足(OutOfMemory),系统彻底宕掉,不能响应任何请求,其危害相当严重.同时,Java堆(He ...
- JavaScript与OC的交互-WebViewJavascriptBridge
WebViewJavascriptBridge实现了在使用UIWebView时JS与ios 的Objective-C nativecode之间的互相调用, 支持的功能有消息发送.接收.消息处理器的注册 ...
- 测试——约跑APP
项目名:约跑APP 用户需求规格说明书URL:http://www.cnblogs.com/liquan/p/6071804.html 组长博客URL:http://www.cnblogs.com/l ...
- PHP Mailer 发送邮件
<?php /* 下载网址 https://github.com/PHPMailer/PHPMailer 打开下载的压缩包文件目录 将 PHPMailer-master 下的 src 文件夹复制 ...
- C语言 aabbcc、abc、fabc、aabc
输入一个字符串,匹配字符串中连续出现的字符串.并且连续个数相等 如输入 aabbcc.abc.fabc.aabc.aabbc 分别输出yes还是no #include<stdio.h>#i ...