这道题也是一道非常有意思的区间$dp$,和在纪中的这道题有点像:取数游戏 (除了取数规则其它好像都一样诶)

当时在纪中的时候就觉得这个$dp$非常不好想,状态定义都不是很容易想到。

但是做过一道这种题之后就要好多了。


以下才是正题:

两人都按照最优策略进行游戏的话,就可以定义状态$dp[i][j]$表示当前操作者面对(用词...有点奇怪?)的区间是$[i,j]$的最优解(最大的数的和),也就是他能够取的数是$a[i]$和a[j]的状态下的最优解。

两人都按最优策略取,取了一次之后先手变后手,所以转移:

$$dp[i][j]=max(sum[i+1][j]-dp[i+1][j]+a[i],sum[i][j-1]-dp[i][j-1]+a[j])$$

相同地,这道题也需要考虑转移时的枚举顺序,按长度从小到大枚举就可以了。

 /*
ID: Starry21
LANG: C++
TASK: game1
*/
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
#define N 105
#define ll long long
#define INF 0x3f3f3f3f
int n;
int a[N];
int dp[N][N],s[N];
int main()
{
freopen("game1.in","r",stdin);
freopen("game1.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
s[i]=s[i-]+a[i];
dp[i][i]=a[i];
}
for(int len=;len<=n;len++)
for(int i=;i<=n-len+;i++)
{
int j=i+len-;
dp[i][j]=max(s[j]-s[i]-dp[i+][j]+a[i],s[j-]-s[i-]-dp[i][j-]+a[j]);
}
printf("%d %d\n",dp[][n],s[n]-dp[][n]);
return ;
}

Code

最新文章

  1. 4_jquery
  2. 添加 index_combine hint的索引
  3. Mifare系列5-存储结构(转)
  4. 优化定时器NSTimer-runloop使用
  5. Nginx 的编译安装和URL地址重写
  6. org.apache.commons.lang.StringUtils类
  7. centos7 u盘启动路径设置
  8. struts2学习笔记之四:多配置文件支持和常用配置参数
  9. Mvc 中ViewBag Model 查找不到解决
  10. 在Android中将子View的坐标转换为父View的坐标
  11. ThinkPad X220i 安装 Mac OSX
  12. ORA-27102: out of memory并伴随OSD-00031的处理
  13. 13个小技巧帮你征服Xcode
  14. Oracle SQL Lesson (10) - 使用DDL语句创建和管理表
  15. Akka(37): Http:客户端操作模式
  16. Redis Cluster架构优化
  17. 怎么构建vue-cli项目
  18. 2018-2019-2 20165335『网络对抗技术』Exp5:MSF基础应用
  19. 三个猜数字游戏代码(Python)
  20. Django基础自测

热门文章

  1. Java多线程1:使用多线程的几种方式以及对比
  2. 兼容系列-IE678的兼容
  3. vscode预览markdown文件
  4. Phantomjs 请求与响应
  5. php的工作原理
  6. os.system 的坑,&#39;C:\Program&#39; 不是内部或外部命令,也不是可运行的程序 或批处理文件
  7. Binding 指令实现双向数据绑定
  8. 【清华集训2016】Alice和Bob又在玩游戏
  9. Vue-CLI项目搭建
  10. confluence -- 命令行备份还原