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 ...
随机推荐
- 关于IDEA无法引入包和类的情况
原因:修改一些包结构后,会出现无法将类引入的情况. 通过清理缓存解决:
- hive中一些常用的sql语句
1.建表 CREATE TABLE IF NOT EXISTS student( time varchar(64) , num int , age int )PARTITIONED BY ( scor ...
- c++头文件重复引用问题
引子----之前写C++ 时遇到的坑 之前由于Java实在太好用了,C++的工程代码几乎没怎么碰,真的写起来的时候总会有些小bug,这里就对其中的一个进行个总结 a.h #include " ...
- null与undefined的比较
null在JavaScript中是关键字,它属于一个特殊的值,即空值. 而undefined它不是关键字,它表示未定义,属于预定义的全局变量. null == undefined 返回的是 true ...
- PAT 1008. Elevator (20)
1008. Elevator (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The highest ...
- 预防onion比特币勒索病毒,如何快速关闭135,137,138,139,445端口
预防onion比特币勒索病毒,如何快速关闭135,137,138,139,445等端口 如果这种网络端口关闭方法行不通,可以尝试一种新的关闭网络端口方法(比较繁琐)见106楼,补丁安装教程见126 ...
- 自动类型安全的.NET标准REST库refit
在SCOTT HANSELMAN 博客上看到一个好东西<Exploring refit, an automatic type-safe REST library for .NET Standar ...
- 关于 AspNet Core 的配置文件 与VS2017 安装
下面链接 是VS2017 安装EXE 我现在装过了就不去截图演示了,有哪位不理解的可以@我. 链接:https://pan.baidu.com/s/1hsjGuJq 密码:ug59 1.今天我给大家带 ...
- 采用Opserver来监控你的ASP.NET项目系列(二、监控SQL Server与Asp.Net项目)
前言 之前有过2篇关于如何监控ASP.NET core项目的文章,有兴趣的也可以看看. 今天我们主要来介绍一下,如何使用Opserver监控我们的SQL Server 和ASP.NET项目的异常监控 ...
- hdu4416 Good Article Good sentence (后缀数组)
题意:问a串中有多少种字符串集合B中没有的连续子串. a的长度10^5,B中的总长度为不超过10^5. 解法:后缀数组题目:后缀数组能够非常easy算出来一个串中有多少种子串. 把a和B集合连起来.求 ...