题干:

有一个长度为N的整数序列,Alice和Bob轮流取数,Alice先取。每次玩家只能从左端或者右端
取一个或多个数,但不能两端都取。所有数都被取走后游戏结束,然后统计每个人取走的所有数之和,
作为各自的得分。两个人采取的策略都是让自己的得分尽量高,并且两个人都足够聪明。

Input

输入第一行为组数T(T<=10)。

对于每组数据第一行为一个整数N(1<=N<=100),第二行为给定的整数序列。

整数的绝对值<=100

Output

对于每组数据,输出Alice和Bob都采取最优策略的情况下,Alice减去Bob的得分后的结果。

Sample Input

2
4
4 -10 -20 7
4
1 2 3 4

Sample Output

7
10

Hint

对于第一组数据: 第一步Alice从左端取1个数,第二步Bob从右端取一个数。

第三步Alice从左端取一个数, 第四步只剩下一个数被Bob取走。

所以,Alice的得分减去Bob的得分为7。

对于第二组数据:Alice直接将全部数取走,所以Alice的得分减去Bob的得分为10。

题目大意:

两个题是一样的题干,只是输入格式是不同的,Uva的是EOF结束,HRBUST的是输入样例个数t。

解题报告:

可以知道整体石子的总和一定的,所以一个人的得分越高,另一个人的得分就越低。不管怎么取任意时刻游戏的状态都是原始序列的一段连续子序列(即被玩家取剩下的序列)。

这里就可以用记忆化搜索了,用dp[i][j]表示在剩下i~j区间数字,在双方都采取最优策略的情况下,先手得分最大值。

d[i][j] = sum[i][j] - min(dp(i + k, j), dp(i, j - k)); (1 <= k <= j - i + 1) ( sum[i][j] 表示i到j的前缀和之差)

AC代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
ll dp[205][205];
ll sum[205],a[205];
ll dfs(int l,int r) {if(dp[l][r] != -1) return dp[l][r];if(l == r) return dp[l][l]=a[l];
//  ll maxx = sum[r] - sum[l-1];ll maxx = -INF;for(int i = l+1; i<=r; i++) {maxx = max(maxx , sum[r] - sum[l-1] - dfs(i,r));}for(int i = r-1; i>=l; i--) {maxx = max(maxx , sum[r] - sum[l-1] - dfs(l,i));}
//  printf("dp[%d][%d] = %lld\n",l,r,maxx);maxx = max(maxx,sum[r] - sum[l-1]);return dp[l][r] = maxx;
}
int main()
{int t,n;cin>>t;while(t--) {scanf("%d",&n);memset(sum,0,sizeof sum);memset(dp,-1,sizeof dp);for(int i = 1; i<=n; i++) scanf("%lld",&a[i]),sum[i] = sum[i-1] + a[i];printf("%lld\n",2*dfs(1,n) - sum[n]);}return 0 ;
}//18:04 - 18:17

总结:

这样是可以AC的,或者直接用这一句

//    ll maxx = sum[r] - sum[l-1];

总之,就是要把“一次全取光”这种情况也考虑进去。

【UVA - 10891 Game of Sum 】【HRBUST - 1622】 Alice and Bob (区间dp,博弈问题)相关推荐

  1. UVA 10891——Game of Sum

    题意:给定一个长度为n的序列,两个人分别从两端开始取若干数,但是规定要么左,要么右,问双方都采取最优策略下A的总和减去B的值. 思路:区间dp,dp(i,j)表示先手的总和,那么状态转移方程便为dp( ...

  2. [UVA 10891] Game of Sum

    图片加载可能有点慢,请跳过题面先看题解,谢谢 很容易想到这样一个状态: \(dp[l][r]\) 表示,\(l\) 到 \(r\) 这一段区间,双方都使用最优策略时,先手能得到的最大分数 $ $ 那么 ...

  3. HDU 4111 Alice and Bob 【DP解决博弈】

    http://acm.hdu.edu.cn/showproblem.php?pid=4111 题目大意:详见http://acm.hrbust.edu.cn/index.php?m=ProblemSe ...

  4. hdu 5708 Alice and Bob(尼姆博弈)

    题目链接:hdu 5708 Alice and Bob Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65536 K (Java ...

  5. uva 10891 - Game of Sum

    题解   白书上  总和一定的  dp 题:经典题 1 #include<iostream> 2 #include<stdio.h> 3 #include<cstring ...

  6. hdu 4597 + uva 10891(一类区间dp)

    题目链接:http://vjudge.net/problem/viewProblem.action?id=19461 思路:一类经典的博弈类区间dp,我们令dp[l][r]表示玩家A从区间[l, r] ...

  7. SDUT2608(Alice and Bob)

    题目描述 Alice and Bob like playing games very much.Today, they introduce a new game. There is a polynom ...

  8. 牛客 - Alice and Bob(尺取+二分)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的数列,和一个数字 kkk.现在给出 mmm 次询问,每次查询需要回答区间 [l,r][l,r][l,r] 内有多少个子区间,满足区间内不同的数字 ...

  9. (2021牛客多校一)A.Alice and Bob(博弈)

    样例输入: 5 2 3 3 5 5 7 7 5 7 7 Bob Alice Bob Bob Alice 题意:有两堆石子,石子数目分别为n和m,Alice和Bob轮流进行以下操作: 从一堆石子中取出k ...

最新文章

  1. 做个有产品意识的工程师
  2. Qt Mac 桌面版本编译出错
  3. HNUSTOJ-1437 无题
  4. wordpress模板-单栏整洁的个人博客Siren主题模板
  5. 开源音乐播放器_如何选择开源音乐播放器
  6. Unity 自定义Log系统
  7. git学习 add - commit - init
  8. 如何快速的复习学习过的Python
  9. 南航计算机学院的实验室,南航计算机科学与技术学院导师介绍:魏欧
  10. linux 时间戳是什么数据类型,Linux时间戳、时间类型转换
  11. python round函数
  12. 使用CSS格式化Table样式
  13. Windows 11的临时文件清理工具
  14. 高手进阶,终极内存技术指南——完整/进阶版 I(转)
  15. Elasticsearch面试专题总结
  16. BZOJ 1776: [Usaco2010 Hol]cowpol 奶牛政坛 贪心lca/点分治
  17. Hadoop3.2.0 HDFS HA ( Quorum Journal Manager )
  18. 《惢客创业日记》2020.11.25-27(周三)为什么是我?
  19. 提取视频中的音频——python三行程序搞定
  20. 大佬帮忙看看加密ts流的.key文件内容,用的是什么加密算法

热门文章

  1. [剑指offer]面试题第[58]题[Leetcode][JAVA][第151题][翻转单词][字符串常用函数总结]
  2. java 私有变量访问_Java - 访问私有实例变量
  3. mysqlnavicat数据库备份与恢复_Navicat如何还原MySQL数据库
  4. OpenCv学习笔记(二)—cv Mat学习
  5. 根据时间戳生成编号_分布式系统的唯一ID生成算法对比
  6. D. Flowers
  7. 关于linux内核的有关叙述中,下列关于嵌入式Linux系统内核的叙述正确的是()。
  8. 源码安装mysql5.1.51
  9. linphone-android移植
  10. java 登录编程_Java编程通过session访问需要登录的页面