JZOJ1322. 硬币游戏
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. 硬币游戏相关推荐
- 2017(秋)软工作业: (2)硬币游戏—— 代码分析与改进
作业目的 Python 程序阅读理解 学习Python 编码风格指南中译版(Google SOC), 改进Python程序 如何设计游戏规则,使得慈善事业可持续. 地铁口放置硬币箱(初始值500硬币) ...
- 51nod 1381 硬币游戏 概率
1381 硬币游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 有一个简单但是很有趣的游戏.在这个游戏中有一个硬币还有一张桌子,这张桌子上有很多平 ...
- [Sdoi2017]硬币游戏 [高斯消元 KMP]
[Sdoi2017]硬币游戏 题意:硬币序列,H T等概率出现,\(n \le 300\)个人猜了一个长为$ m \le 300$的字符串,出现即获胜游戏结束.求每个人获胜概率 考场用了[1444: ...
- 软工作业2:硬币游戏——代码的分析与改进
目的: Python 程序阅读理解 学习Python 编码风格指南中译版(Google SOC), 改进Python程序 如何设计游戏规则,使得慈善事业可持续. 地铁口放置硬币箱(初始值500硬币), ...
- 【BZOJ4820】[SDOI2017]硬币游戏(高斯消元)
[BZOJ4820][SDOI2017]硬币游戏(高斯消元) 题面 BZOJ 洛谷 题解 第一眼的感觉就是构\(AC\)自动机之后直接高斯消元算概率,这样子似乎就是\(BZOJ1444\)了.然而点数 ...
- JZOJ 1322. 硬币游戏
Description FJ的奶牛喜欢玩硬币游戏,所以FJ发明了一个新的硬币游戏.一开始有N(5<=N<=2,000)个硬币堆成一叠,从上往下数第i个硬币有一个整数值C_i(1<=C ...
- 浅谈 翻硬币游戏【Nim博弈】
ACM博客_kuangbin 博弈-翻硬币游戏 hihoCoder 1172 : 博弈游戏·Nim游戏·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Alice和B ...
- BZOJ 1411Vijos 1544 : [ZJOI2009]硬币游戏【递推,快速幂】
1411: [ZJOI2009]硬币游戏 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 897 Solved: 394 [Submit][Stat ...
- 敏捷游戏:从硬币游戏学习Scrum敏捷方法
在Scrum硬币游戏和the-scrum-penny-game-a-modification中都介绍了这个硬币游戏,我觉得不错,如果游戏者真正参与进来,应该能够体会到较多的敏捷思想.而最近项目组也来了 ...
最新文章
- 提升jmeter自身性能
- [ATF]-TEE/REE系统切换时ATF的寄存器的保存和恢复
- Java黑皮书课后题第5章:**5.25(计算π)使用下面的数列可以近似计算π:4(1-1/3+1/5-1/7+……+(Math.pow(-1, i+1)/(2*i-1))
- C语言学习之求∑k(k=100)+∑K*k(k=50)+∑1/k(k=10)
- wpf加载上千张图片部分图片不显示_开源WPF控件库MaterialDesignInXAML推荐
- Objective-C 日记③ 字符串
- table多行表头合并 vue_vue elementUI table 自定义表头和行合并的实例代码
- matlab分析矩阵与线性变换
- android webview打印,javascript - 如何在Android Webview中使网站上的打印按钮工作? - 堆栈内存溢出...
- Android OpenGL ES(十二):三维坐标系及坐标变换初步 .
- 查看tomcat端口号
- A3C的算法原理和算法流程
- SAR图像去噪算法汇总
- html怎么把图片的图层,PS制作-把图片添加到图层的4种方法
- python3 subprocess.Popen监控控制台输出
- NC高级UI工厂笔记
- 优惠券通用测试要点 V1.1
- 软件测试与软件开发的关系是怎样的?
- matlab列向量求平均值和求方差
- php伪协议xss,XSS漏洞学习