最开始的时候思路就想错了,就不说错误的思路了。

因为这n个数的总和是一定的,所以在取数的时候不是让自己尽可能拿的最多,而是让对方尽量取得最少。

记忆化搜索(时间复杂度O(n3)):

d(i, j)表示原序列中第i个元素到第j个元素构成的子序列,先手取数能够得到的最大值。

sum(i, j) 表示从第i个元素到第j个元素的和

因为要让对手获得最小的分数,所以状态转移方程为:

d(i, j) = sum(i, j) - min{d(枚举所有可能剩给对手的序列), 0(0代表全部取完)}

s数组保存a中前i个元素的和,这样sum(i, j) = s[j] - s[i-1]

 #define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = + ;
int a[maxn], s[maxn], d[maxn][maxn], vis[maxn][maxn]; int dp(int i, int j)
{
if(vis[i][j])
return d[i][j];
vis[i][j] = ;
int m = ;
for(int k = i + ; k <= j; ++k)
m = min(m, dp(k, j));
for(int k = j - ; k >= i; --k)
m = min(m, dp(i, k));
d[i][j] = s[j] - s[i-] - m;
return d[i][j];
} int main(void)
{
#ifdef LOCAL
freopen("10891in.txt", "r", stdin);
#endif int n;
while(scanf("%d", &n) == && n)
{
s[] = ;
for(int i = ; i <= n; ++i)
{
scanf("%d", &a[i]);
s[i] = s[i-] + a[i];
}
memset(vis, , sizeof(vis));
printf("%d\n", *dp(, n) - s[n]);
}
return ;
}

代码君

递推(时间复杂度O(n2)):

令f(i, j) = min{d(i, j), d(i+1, j),,,d(j, j)}

g(i, j) = min{d(i, j), d(i, j-1),,,d(i, i)}

则状态转移方程可写成:

d(i, j) = min{f(i+1, j), g(i, j-1), 0}

f和g的递推为:

f(i, j) = min{d(i, j), f(i+1, j)}

g(i, j) = min{d(i, j), g(i, j-1)}

 //#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = + ;
int a[maxn], s[maxn], d[maxn][maxn], f[maxn][maxn], g[maxn][maxn]; int main(void)
{
#ifdef LOCAL
freopen("10891in.txt", "r", stdin);
#endif int n;
while(scanf("%d", &n) == && n)
{
s[] = ;
for(int i = ; i <= n; ++i)
{
scanf("%d", &a[i]);
s[i] = s[i-] + a[i];
}
for(int i = ; i <= n; ++i)//边界
d[i][i] = f[i][i] = g[i][i] = a[i];
for(int L = ; L < n; ++L)
for(int i = ; i + L <= n; ++i)
{
int j = i + L;
int m = ;
m = min(m, f[i+][j]);
m = min(m, g[i][j-]);
d[i][j] = s[j] - s[i-] - m;
//更新f和g
f[i][j] = min(d[i][j], f[i+][j]);
g[i][j] = min(d[i][j], g[i][j-]);
} printf("%d\n", *d[][n] - s[n]);
}
return ;
}

代码君

UVa 10891 (博弈+DP) Game of Sum的更多相关文章

  1. UVA 10891 区间DP+博弈思想

    很明显带有博弈的味道.让A-B最大,由于双方都采用最佳策略,在博弈中有一个要求时,让一方的值尽量大.而且由于是序列,所以很容易想到状态dp[i][j],表示序列从i到j.结合博弈中的思想,表示初始状态 ...

  2. uva 10891 区间dp+记忆化搜索

    https://vjudge.net/problem/UVA-10891 给定一个序列x,A和B依次取数,规则是每次只能从头或者尾部取走若干个数,A和B采取的策略使得自己取出的数尽量和最大,A是先手, ...

  3. 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 ...

  4. UVa 10891 Game of Sum (DP)

    题意:给定一个长度为n的整数序列,两个人轮流从左端或者右端拿数,A先取,问最后A的得分-B的得分的结果. 析:dp[i][j] 表示序列 i~j 时先手得分的最大值,然后两种决策,要么从左端拿,要么从 ...

  5. UVA 10891 SUM游戏 DP

    刚看到这个题目不知道怎么个DP法,有点难想到 解法如下 设置dp[i][j]代表i到j这段子序列能获得的最大值,这样,枚举m=min(m,dp[i+1到j][j],dp[i][i到j-1]),m就代表 ...

  6. [题解]UVa 10891 Game of Sum

    在游戏的任何时刻剩余的都是1 - n中的一个连续子序列.所以可以用dp[i][j]表示在第i个数到第j个数中取数,先手的玩家得到的最大的分值.因为两个人都很聪明,所以等于自己和自己下.基本上每次就都是 ...

  7. 09_Sum游戏(UVa 10891 Game of Sum)

    问题来源:刘汝佳<算法竞赛入门经典--训练指南> P67 例题28: 问题描述:有一个长度为n的整数序列,两个游戏者A和B轮流取数,A先取,每次可以从左端或者右端取一个或多个数,但不能两端 ...

  8. UVa 10891 Game of Sum - 动态规划

    因为数的总和一定,所以用一个人得分越高,那么另一个人的得分越低. 用$dp[i][j]$表示从$[i, j]$开始游戏,先手能够取得的最高分. 转移通过枚举取的数的个数$k$来转移.因为你希望先手得分 ...

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

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

随机推荐

  1. php中用于接受表单数据的$_request与$_post、$_get

    一.$_request与$_post.$_get的区别和特点 $_REQUEST[]具用$_POST[] $_GET[]的功能,但是$_REQUEST[]比较慢.通过post和get方法提交的所有数据 ...

  2. 【基本算法】 KMP文本串模式串的字符串匹配算法

    看了两个晚上的KMP,加上基本的“暴力匹配” 今晚看懂next[j]递归求解时,突然觉得算法真的好美妙,虽然觉悟的晚但晚胜过没有是吧! 我的博客都是应试性的学习笔记,不具备指导性,还是大神们写的好,例 ...

  3. 【面试题】Google of Greater China Test for New Grads of 2014总结

    2014年Google中国校园招聘采用在线技术笔试,在Code Jam平台上,14号9点到15号9点开放测试题,帮助大家熟悉环境.这个周末也有够忙的,当时就上去看了一下,把输入文件下了一下,今天才把题 ...

  4. WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发

    .Net Remoting的激活方式也有三种:SingleTon模式.SingleCall模式.客户端激活方式,WCF服务实例激活类型包括三种方式:单调服务(Call Service),会话服务(Se ...

  5. [转载] poll()函数

    原地址:http://baike.baidu.com/view/2997591.htm   poll()函数:这个函数是某些Unix系统提供的用于执行与select()函数同等功能的函数,下面是这个函 ...

  6. Android上使用MP3格式录制声音

    0. 下载LAME 并解压缩 http://lame.sourceforge.net/download.php http://sourceforge.net/projects/lame/files/l ...

  7. Yarn中如何生成状态机图

    原文 http://xiguada.org/yarn_state_picture/ 在Hadoop2.0系列的版本里,采用了状态机的方式处理ResourceManager,NodeManager,Ma ...

  8. iOS开发--storyboard适配pin

  9. React事件函数简介

    一.事件汇总 二.例子 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset= ...

  10. 【重走Android之路】【番外篇】关于==和equals

    [重走Android之路][番外篇]关于==和equals   在实际的编程当中,经常会使用==和equals来判断变量是否相同.但是这两种比较方式也常常让人搞得云里雾里摸不着头脑.下面是我个人做的总 ...