UVA 10891 Game of Sum
题目大意就是有一个整数串,有两个人轮流取,每次可以取走一个前缀或后缀。两人都足够聪明,且都会使自己收益最大。求取完后先手比后手多多少。
每次我看见上面那句就会深感自己的愚笨无知。
所以来推推性质?
1.两人取的和是一定的,所以只要先手收益尽量大就可以了,问题转化为求收益尽量大。
2.对于一个区间(l,r),确定了先后手关系,因为两人都足够聪明,所以答案是确定的。
3.因为每次都是从前面或后面取,所以不管怎么取,剩下的一定是一段连续的串。
对于这种两人够聪明但我不聪明的问题,就把聪明丢给状态就可以了。
直接设D(L,R)表示先手在当前串为[l,r]时聪明地选的最大收益。
那么怎么转移呢?先手收益就是总和-后手收益,综合不变,就是要后手收益最小。
因为后手在先手取完后转先手,所以状态转移就出来了。
D(i,j)=Sum(i,j)-min( (D(i+1,j),D(i+2,j),……,D(j,j)) , (D(i,j-1),D(i,j-2),……,D(i,i)) , 0 )。
其中前面是本次从左边取一段,中间是本次从右边取一段,后面是本次取完。
这么写起来可以打记忆搜,复杂度是O(n^3)的,也跑得过去了。
看着上面那个式子很想优化一下?
设 f(i,j)=min(D(i,j),D(i+1,j),……,D(j,j)), g(i,j)=min(D(i,j-1),D(i,j-2),……,D(i,i))。
则D(i,j)=min( min( f(i+1,j),g(i,j-1) ) , 0)。
f和g的转移也很好做。
f(i,j) = min ( f(i+1,j) , D(i,j) ),g(i,j) = min ( g(i,j-1) , D(i,j) )。
于是就可以O(n^2)解决辣。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
#include <complex>
#include <stack>
#define LL long long int
#define dob double
#define FILE "10891"
using namespace std; const int N = ;
int n,f[N][N],g[N][N],D[N][N],S[N]; inline int gi(){
int x=,res=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')res*=-;ch=getchar();}
while(ch<=''&&ch>='')x=x*+ch-,ch=getchar();
return x*res;
} int main()
{
while(n=gi()){
memset(f,,sizeof(f));memset(g,,sizeof(g));
for(int i=;i<=n;++i)
S[i]=S[i-]+(D[i][i]=f[i][i]=g[i][i]=gi());
for(int len=;len<=n;++len)
for(int i=;i<=n;++i){
int j=i+len-;if(j>n)break;
D[i][j]=S[j]-S[i-]-min(,min(f[i+][j],g[i][j-]));
f[i][j]=min(f[i+][j],D[i][j]);
g[i][j]=min(g[i][j-],D[i][j]);
}
printf("%d\n",*D[][n]-(S[n]-S[]));
}
return ;
}
Game of Sum
UVA 10891 Game of Sum的更多相关文章
- 09_Sum游戏(UVa 10891 Game of Sum)
问题来源:刘汝佳<算法竞赛入门经典--训练指南> P67 例题28: 问题描述:有一个长度为n的整数序列,两个游戏者A和B轮流取数,A先取,每次可以从左端或者右端取一个或多个数,但不能两端 ...
- uva 10891 Game of Sum(区间dp)
题目连接:10891 - Game of Sum 题目大意:有n个数字排成一条直线,然后有两个小伙伴来玩游戏, 每个小伙伴每次可以从两端(左或右)中的任意一端取走一个或若干个数(获得价值为取走数之和) ...
- [题解]UVa 10891 Game of Sum
在游戏的任何时刻剩余的都是1 - n中的一个连续子序列.所以可以用dp[i][j]表示在第i个数到第j个数中取数,先手的玩家得到的最大的分值.因为两个人都很聪明,所以等于自己和自己下.基本上每次就都是 ...
- UVa 10891 Game of Sum - 动态规划
因为数的总和一定,所以用一个人得分越高,那么另一个人的得分越低. 用$dp[i][j]$表示从$[i, j]$开始游戏,先手能够取得的最高分. 转移通过枚举取的数的个数$k$来转移.因为你希望先手得分 ...
- UVa 10891 - Game of Sum 动态规划,博弈 难度: 0
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- UVA 10891 Game of Sum(区间DP(记忆化搜索))
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- UVA - 10891 Game of Sum 区间DP
题目连接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19461 Game of sum Description This ...
- UVA 10891 Game of Sum(DP)
This is a two player game. Initially there are n integer numbers in an array and players A and B get ...
- 28.uva 10891 Game of Sum 记忆化dp
这题和上次的通化邀请赛的那题一样,而且还是简化版本... 那题的题解 请戳这里 ... #include<cstdio> #include<algorithm> #i ...
随机推荐
- 正则化方法:L1和L2 regularization、数据集扩增、dropout(转)
ps:转的.当时主要是看到一个问题是L1 L2之间有何区别,当时对l1与l2的概念有些忘了,就百度了一下.看完这篇文章,看到那个对W减小,网络结构变得不那么复杂的解释之后,满脑子的6666------ ...
- HTML Entity 字符实体
目录 1. HTML Entity 2. 字符与Entity Name的互相转换 3. 字符与Entity Number的互相转换 1. HTML Entity 1.1 介绍 在编写HTML页面时,需 ...
- 苹果快速的修复了Mac OS High Sierra 上出现了root的漏洞
最近苹果因为Mac最新系统 Mac OS High Sierra 上出现了root的漏洞走上了风口浪尖,不过还好,在一封苹果给科技媒体'9to5 Mac'的回复中得知,苹果在接收到报告之后,立即展开修 ...
- 五、Hadoop学习笔记————调优之硬件选择
ResourceManageer服务器需要选择性能较好的 若有1TB数据,每天增量为10GB,则需要预留17.8TB,*3是因为有三分备份,*1.3是因为还需要预留出空间给操作系统等等 若集群在三十台 ...
- python并发编程之多进程一
一,什么是进程 进程是操作系统结构的基础:是一个正在执行的程序:计算机中正在运行的程序实例:可以分配给处理器并由处理器执行的一个实体: 二,进程与程序的区别 进程即运行中的程序,从中即可知,进程是在运 ...
- linux安装redis(转)
一.Redis介绍 Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类型相对更多 ...
- solr6.5.0版本(Windows安装图解)
此教程为solr6.5.0安装,自己制作,希望可以帮到你们.
- Dos命令的巧用
豪华绚丽的Windows让人们把DOS抛到遥远的记忆角落,然而,真正有价值的东西不会轻易退出历史的舞台.很多人都已经习惯于 Windows的图形化用户界面,熟不知古老的DOS命令却可以轻易的办到很多事 ...
- JSONPath使用
JSONPath是fastjson在1.2.0之后支持的.JSONPath是一个很强大的功能.关于JSONPath的介绍请查看官方文档 JSONPath. 官方文档上给出了详细的说明以及使用.但是官方 ...
- Activiti源代码分析
ExecutionEntity内部含有parent,是一个运行树或运行路径.应该是一个流程实例的运行过程,一个实例相应一个ExecutionEntity,通过getActivity得到的是当前正在运行 ...