Description

  FJ的奶牛喜欢玩硬币游戏,所以FJ发明了一个新的硬币游戏。一开始有N(5<=N<=2,000)个硬币堆成一叠,从上往下数第i个硬币有一个整数值C_i(1<=C_i<=100,000)。
  两个玩家轮流从上倒下取硬币,玩家1先取,可以从上面取1个或2个硬币,下一轮的玩家可以取的硬币数量最少为1个,最多为上一个玩家取的数量的2倍,硬币全部取完比赛结束。
  已知玩家2绝顶聪明,会采用最优策略,现在请你帮助玩家1,使得玩家1取得的硬币值的和最大。

分析

第一眼看下去感觉就是博弈,
没想到正解竟然是DP。
下次见到博弈的题目也应该要往DP方面想一想。
我们知道影响答案的因素只有两个:当前取到第几个硬币、上一次取了多少。
我们设 fi,j f_{i,j}表示取到第i位,上一次取了j个,先手的最优答案。
转移:考虑这一次要取多少个,枚举一个 k(1≤k≤2∗j) k (1≤k≤2*j)
先手肯定可以得到i~i+k-1这一区间的硬币。
在他取了这k个以后,就变为了对手为先手,取到第i+k位,上一次取了k。
对手也是用最优策略,所以他可以得到的硬币值为 fi+k,k f_{i+k,k}
也就是说,留给我们的硬币值就为这一段区间的和减去 fi+k,k f_{i+k,k}

但是,状态是 n2 n^2,转移是n的,总的复杂度是 n3 n^3
不过我们发现,在每次枚举k的时候只有最后两个是有意义的,
所以转移可以优化到O(1),总的复杂度就是 O(n2) O(n^2)了

将硬币值倒过来做会方便一些。

code

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string.h>
#include <cmath>
#include <math.h>
#define N 2003
using namespace std;
int n,a[N],f[N][N],sum[N];
char ch;
void read(int &n)
{n=0;ch=getchar();while((ch<'0' || ch>'9') && ch!='-')ch=getchar();int w=1;if(ch=='-')w=-1,ch=getchar();while('0'<=ch && ch<='9')n=n*10+ch-'0',ch=getchar();n*=w;
}
int main()
{read(n);for(int i=1;i<=n;i++)read(a[n-i+1]);for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){f[i][j]=f[i][j-1];if(i>=2*j-1)f[i][j]=max(f[i][j],sum[i]-f[i-2*j+1][2*j-1]);if(i>=2*j)f[i][j]=max(f[i][j],sum[i]-f[i-2*j][2*j]);}printf("%d",f[n][1]);
}

JZOJ1322. 硬币游戏相关推荐

  1. 2017(秋)软工作业: (2)硬币游戏—— 代码分析与改进

    作业目的 Python 程序阅读理解 学习Python 编码风格指南中译版(Google SOC), 改进Python程序 如何设计游戏规则,使得慈善事业可持续. 地铁口放置硬币箱(初始值500硬币) ...

  2. 51nod 1381 硬币游戏 概率

    1381 硬币游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 有一个简单但是很有趣的游戏.在这个游戏中有一个硬币还有一张桌子,这张桌子上有很多平 ...

  3. [Sdoi2017]硬币游戏 [高斯消元 KMP]

    [Sdoi2017]硬币游戏 题意:硬币序列,H T等概率出现,\(n \le 300\)个人猜了一个长为$ m \le 300$的字符串,出现即获胜游戏结束.求每个人获胜概率 考场用了[1444: ...

  4. 软工作业2:硬币游戏——代码的分析与改进

    目的: Python 程序阅读理解 学习Python 编码风格指南中译版(Google SOC), 改进Python程序 如何设计游戏规则,使得慈善事业可持续. 地铁口放置硬币箱(初始值500硬币), ...

  5. 【BZOJ4820】[SDOI2017]硬币游戏(高斯消元)

    [BZOJ4820][SDOI2017]硬币游戏(高斯消元) 题面 BZOJ 洛谷 题解 第一眼的感觉就是构\(AC\)自动机之后直接高斯消元算概率,这样子似乎就是\(BZOJ1444\)了.然而点数 ...

  6. JZOJ 1322. 硬币游戏

    Description FJ的奶牛喜欢玩硬币游戏,所以FJ发明了一个新的硬币游戏.一开始有N(5<=N<=2,000)个硬币堆成一叠,从上往下数第i个硬币有一个整数值C_i(1<=C ...

  7. 浅谈 翻硬币游戏【Nim博弈】

    ACM博客_kuangbin 博弈-翻硬币游戏 hihoCoder 1172 : 博弈游戏·Nim游戏·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Alice和B ...

  8. BZOJ 1411Vijos 1544 : [ZJOI2009]硬币游戏【递推,快速幂】

    1411: [ZJOI2009]硬币游戏 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 897  Solved: 394 [Submit][Stat ...

  9. 敏捷游戏:从硬币游戏学习Scrum敏捷方法

    在Scrum硬币游戏和the-scrum-penny-game-a-modification中都介绍了这个硬币游戏,我觉得不错,如果游戏者真正参与进来,应该能够体会到较多的敏捷思想.而最近项目组也来了 ...

最新文章

  1. 提升jmeter自身性能
  2. [ATF]-TEE/REE系统切换时ATF的寄存器的保存和恢复
  3. Java黑皮书课后题第5章:**5.25(计算π)使用下面的数列可以近似计算π:4(1-1/3+1/5-1/7+……+(Math.pow(-1, i+1)/(2*i-1))
  4. C语言学习之求∑k(k=100)+∑K*k(k=50)+∑1/k(k=10)
  5. wpf加载上千张图片部分图片不显示_开源WPF控件库MaterialDesignInXAML推荐
  6. Objective-C 日记③ 字符串
  7. table多行表头合并 vue_vue elementUI table 自定义表头和行合并的实例代码
  8. matlab分析矩阵与线性变换
  9. android webview打印,javascript - 如何在Android Webview中使网站上的打印按钮工作? - 堆栈内存溢出...
  10. Android OpenGL ES(十二):三维坐标系及坐标变换初步 .
  11. 查看tomcat端口号
  12. A3C的算法原理和算法流程
  13. SAR图像去噪算法汇总
  14. html怎么把图片的图层,PS制作-把图片添加到图层的4种方法
  15. python3 subprocess.Popen监控控制台输出
  16. NC高级UI工厂笔记
  17. 优惠券通用测试要点 V1.1
  18. 软件测试与软件开发的关系是怎样的?
  19. matlab列向量求平均值和求方差
  20. php伪协议xss,XSS漏洞学习

热门文章

  1. 你也可以做一个简易抽奖程序!
  2. 每日Reverse之reverse1
  3. 快递手持终端是什么?
  4. pdf怎么转换成jpg格式欣赏
  5. excel图片随数据更新而更新
  6. 计算机与生物的关系论文题目,怎样给自己的论文取个好标题?
  7. 马云:每个人都把我当靶子 已2个多月没去总部
  8. 黑客侵入电视台微博谎称奥巴马遭枪杀
  9. ubuntu 添加桌面图标_将垃圾桶图标添加到您的Ubuntu桌面
  10. Python玩转微信 个性签名生成词云图