因为数的总和一定,所以用一个人得分越高,那么另一个人的得分越低。  

  用$dp[i][j]$表示从$[i, j]$开始游戏,先手能够取得的最高分。

  转移通过枚举取的数的个数$k$来转移。因为你希望先手得分尽量高,所以另一个人的最高得分应尽量少。

  $dp[i][j] = sum[i][j] - \min \{dp[i + k][j],dp[i][j - k]\}$

  但是发现计算$dp[i + k][j],dp[i][j - k]$的最小值的地方很重复,所以用一个$f[i][j]$储存前者的最优值,$g[i][j]$储存后者的最优值。

  这样就将代码的时间复杂度优化到O(n2)

Code

 /**
* uva
* Problem#10891
* Accepted
* Time:0ms
*/
#include<iostream>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<sstream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<stack>
using namespace std;
typedef bool boolean;
#define INF 0xfffffff
#define smin(a, b) a = min(a, b)
#define smax(a, b) a = max(a, b)
template<typename T>
inline void readInteger(T& u){
char x;
long long aFlag = ;
while(!isdigit((x = getchar())) && x != '-');
if(x == '-'){
x = getchar();
aFlag = -;
}
for(u = x - ''; isdigit((x = getchar())); u = (u << ) + (u << ) + x - '');
ungetc(x, stdin);
u *= aFlag;
} int n;
int *list;
int f[][];
int g[][];
int dp[][]; inline boolean init(){
readInteger(n);
if(n == ) return false;
list = new int[(const int)(n + )];
for(int i = ; i <= n; i++){
readInteger(list[i]);
}
return true;
} int *sum;
inline void getSum(){
sum = new int[(const int)(n + )];
sum[] = ;
for(int i = ; i <= n; i++)
sum[i] = sum[i - ] + list[i];
} inline void solve(){
memset(f, 0x7f, sizeof(f));
memset(g, 0x7f, sizeof(g));
for(int i = ; i <= n; i++) f[i][i] = g[i][i] = dp[i][i] = list[i];
for(int k = ; k < n; k++){
for(int i = ; i + k <= n; i++){
int j = i + k;
int m = ;
smin(m, f[i + ][j]);
smin(m, g[i][j - ]);
dp[i][j] = sum[j] - sum[i - ] - m;
f[i][j] = min(f[i + ][j], dp[i][j]);
g[i][j] = min(g[i][j - ], dp[i][j]);
}
}
printf("%d\n", dp[][n] * - sum[n]);
delete[] list;
delete[] sum;
} int main(){
while(init()){
getSum();
solve();
}
return ;
}

最新文章

  1. direct path read
  2. 基于纯 CSS3 技术实现美观的标签云效果
  3. 在浏览器输入网址到页面加载完毕中间到底发生了什么?(Browser--&gt;Server)
  4. 封装原生Ajax
  5. linux 查找命令
  6. mysql 批量插入
  7. .NET获取英文月份缩写名(可获取其他国家)
  8. jquery判断图片是否加载完毕
  9. PHP 安装 Xdebug 扩展(一)
  10. java.lang.Collections
  11. 邓_PHP面试【001】
  12. javascript之DOM编程改变CSS样式(简易验证码显示)
  13. nginx系列 2 概述
  14. C语言--第1次作业2.0版
  15. license
  16. 如何给30台centos7服务器分别增加相同的用户
  17. cefSharp 开发随笔
  18. C++:复制构造函数
  19. 什么时候用var关键字
  20. shell语法使用

热门文章

  1. web前端开发笔记(2)
  2. MySQL Error 1215: Cannot add foreign key constraint
  3. Subsequence---poj3061(尺取法||二分)
  4. git push 文件过大时出错,fatal: The remote end hung up unexpectedly
  5. Servlet----------Servlet 的映射路径细节
  6. linux基础(1)-终端&amp;shell类型&amp;命令&amp;文件系统&amp;命令帮助的获取
  7. api文档生成器apidoc的安装和使用
  8. SQL 1
  9. HDU5012:Dice(bfs模板)
  10. openstack部署心得