题意:有n颗石子 两个人轮流拿 如果上一个人拿了x颗 这个人就可以拿x或x+1颗

   问先手能获得与后手的价值差最大是多少

题解:看起来是博弈 其实是DP

   dp[i][j][0/1]表示当前该0/1拿 拿到第i颗上一个人拿了j个 转移就很裸了

   因为当前有两种操作拿x个和拿x+1个 要知道哪一个操作更好 需要知道后面的状态 所以就倒着DP

   因为爆内存就滚动了  对2^k取% = & 2^k - 1 感觉这样滚动会少个常数

#include <bits/stdc++.h>
using namespace std; int q[];
int sum[];
int dp[][][]; int main()
{
int T;
scanf("%d", &T);
while(T--)
{
sum[] = ;
int n; scanf("%d", &n);
for(int i = ; i <= n; i++) scanf("%d", &q[i]), sum[i] = sum[i - ] + q[i]; memset(dp, , sizeof(dp));
for(int i = n; i >= ; i--)
{
for(int j = ; j <= ; j++)
{
if(i + j == n + )
{
dp[i & ][j][] = sum[n] - sum[i - ];
dp[i & ][j][] = sum[i - ] - sum[n];
break;
} dp[i & ][j][] = max(dp[(i + j) & ][j][], dp[(i + j + ) & ][j + ][] + q[i + j]) + sum[i + j - ] - sum[i - ];
dp[i & ][j][] = min(dp[(i + j) & ][j][], dp[(i + j + ) & ][j + ][] - q[i + j]) - sum[i + j - ] + sum[i - ];
}
}
printf("%d\n", dp[][][]);
}
return ;
}

最新文章

  1. Laravel大型项目系列教程(二)之用户管理
  2. 无锁队列以及ABA问题
  3. PHP将XML数据转换为数组
  4. js中Math.random()生成指定范围数值的随机数
  5. HDP2.4安装(二):Centos7配置
  6. hdu 4447 Yuanfang, What Do You Think?
  7. 酷派8150S(移动定制版)可用的第三方Recovery备份数据、刷机并精简系统内置APK经验
  8. TimeUnit(转)
  9. codeforce --- 237C
  10. 单元测试不是梦,Android+PowerMock系列(1) —— 在Eclipse里搭建测试环境
  11. SQL Server2008R2安装失败问题之语言包问题
  12. hdr_beg(host) 主机名开始
  13. 一段代码详解JavaScript面向对象
  14. C++ 构造函数或析构函数调用虚函数
  15. 实践作业2:黑盒测试实践——安装配置测试工具 Day 3
  16. zookeeper学习总结
  17. CSS---文档流布局 | 脱标-postion-zindex | 脱标-浮动
  18. Java代码操作HDFS
  19. 实现一个优先级队列,每次pop 返回优先级最高的元素
  20. 自然语言交流系统 phxnet团队 创新实训 项目博客 (九)

热门文章

  1. Linux常用的18个命令(复习)
  2. hdoj5387【模拟】
  3. hdoj5563(简单几何)
  4. 自己动手搭建SSM
  5. loj#2540. 「PKUWC2018」随机算法
  6. 你真的懂了redis的数据结构吗?redis内部数据结构和外部数据结构揭秘
  7. IT兄弟连 JavaWeb教程 Servlet 状态管理 会话跟踪
  8. (九)SpringBoot整合redis框架
  9. Java关键字abstract与final总结
  10. iOS MD5 (Swift3)