[USACO09NOV]硬币的游戏 博弈 dp
LINK : coin game
这道题 超级经典去年这个时候我就看过题目了 但时至今日还不会/cy 觉得在做比赛的题目的时候少写省选的题目 多做水题多做不难也不简单的题目就好了。
由于我是真的不会博弈上dp(其实我博弈都不太会...故写这道题的时候没有过多的思考只是草草想了一波状态就直接看题解了发现状态都列错了。
当我 理解题解中的做法感觉还不是特别的自然故写一篇题解来印证自己的理解。
这里我写上最初始的思路吧 题目中想让我们两个玩家都选择最优的情况下 第一个玩家最多能获得多少的钱。看起来是一个博弈但是题目中有限制条件前一个玩家取了j个硬币的话后一个玩家最多取2*j个硬币。
那如何进行这个过程的呢 我们很难去博弈吧因为没有必胜点和必败点这个东西 不论胜败且每次决策紧扣下一次的决策 搜索复杂度超级高。
开始我也不知道应该选什么取得最优 如果我知道后续的状态 我们从起手的状态转移到最优后续的状态就好了 可是我们并不知道后续的状态?考虑先把后面的东西求出来转移到前面的比较好。
因为结束之后的状态我们是知道的选完了最后的状态显然是0 就从这个状态转移好了那么就有了状态 f[i]表示剩下i个硬币此时选择的最优状态首先解决的一个问题是由于两个人 都是选取最优的方法 故状态转移显然是一样的我们只要每次转移的时候从对方最优状态之中选择一个对自己最优的状态就好了 故转移到f[n] 由于第一个玩家先选 f[n] 就是我们的答案了 f[i]=max{sum[i]-f[k];}有了这个状态 相信此时对于两个人拥有同一个状态没有什么疑问了吧两个人都是选取最优的方法显然其实对方也是f数组的含义这样就计算好了f当前这个人如果选的话的最优解 显然我们还需要知道选择了多少个方便转移 那么状态空间到此就非常的完善了 f[i][j]表示剩下i个硬币上一次选了j个硬币的最优解 那么显然了状态转移 f[i][j]=max{sum[i]-f[i-k][k]} 其中k属于 1~2*j 然后 答案自然就是f[n][1]了。
非常的自然 不是么 我觉得难度还是有的 这值得我慢慢的推敲... 相信状态是我唯一的选择的。
//#include<bits/stdc++.h>
#include<iostream>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<cctype>
#include<utility>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<deque>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<iomanip>
#include<stack>
#include<string>
#include<cstring>
#define INF 2000000000
#define ll long long
#define db double
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)>(y)?(y):(x))
#define mp(x,y) make_pair(x,y)
using namespace std;
char buf[<<],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,,<<,stdin),fs==ft))?:*fs++;
}
inline int read()
{
int x=,f=;char ch=getc();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getc();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getc();}
return x*f;
}
const int MAXN=;
int n;
int a[MAXN],sum[MAXN];
int f[MAXN][MAXN];//f[i][j]表示 现在剩下1~i枚金币且上次取了j次当前第一个玩家能取到的最多钱数
int main()
{
//freopen("1.in","r",stdin);
n=read();
for(int i=n;i>=;--i)a[i]=read();
for(int i=;i<=n;++i)sum[i]=sum[i-]+a[i];
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
{
f[i][j]=f[i][j-];
int w=(j<<)-;
if(w<=i)f[i][j]=max(f[i][j],sum[i]-f[i-w][w]);
++w;if(w<=i)f[i][j]=max(f[i][j],sum[i]-f[i-w][w]);
}
printf("%d\n",f[n][]);
return ;
}
[USACO09NOV]硬币的游戏 博弈 dp的更多相关文章
- tyvj P1075 - 硬币游戏 博弈DP
P1075 - 硬币游戏 From price Normal (OI)总时限:10s 内存限制:128MB 代码长度限制:64KB 背景 Background 农民John的牛喜欢玩 ...
- [luogu2964][USACO09NOV][硬币的游戏A Coin Game] (博弈+动态规划)
题目描述 Farmer John's cows like to play coin games so FJ has invented with a new two-player coin game c ...
- P2964 [USACO09NOV]硬币的游戏A Coin Game (DP)
题意:n颗硬币 两个人从前往后按顺序拿 如果上一个人拿了i颗 那么下一个可以拿1-2*i颗 问先手能获得的最大收益 题解:比较典型的最大最小最大最小..DP了 但是暴力做的话是n^3 所以就体现出了这 ...
- 洛谷P2964 [USACO09NOV]硬币的游戏A Coin Game
题目描述 Farmer John's cows like to play coin games so FJ has invented with a new two-player coin game c ...
- 计蒜客 取数游戏 博弈+dp
题目链接 取数游戏 思路:dp(x, y)表示先手在区间[x, y]能取得的最大分数.当先手取完,就轮到后手去,后手一定会选择当前能令他得到最大分数的策略,其实当先手在[x, y]区间两端取走一个数, ...
- [USACO09NOV]硬币的游戏A Coin Game
https://daniu.luogu.org/problemnew/show/P2964 dp[i][j] 表示桌面上还剩i枚硬币时,上一次取走了j个的最大得分 枚举这一次要拿k个,转移到dp[i- ...
- LUOGU P2964 [USACO09NOV]硬币的游戏A Coin Game
题目描述 Farmer John's cows like to play coin games so FJ has invented with a new two-player coin game c ...
- 【P2964】硬币的游戏(DP+前缀和)
一道DP,思维难度真是不小. 首先对于这个题的数据,我们可以发现差不多可以支持n^2logn,但是貌似也不会有这种复杂度的线性DP(至少这个题看上去不是这样).所以我们考虑N^2做法.因为求得是价值和 ...
- [LUOGU2964] [USACO09NOV]硬币的游戏A Coin Game
题目描述 Farmer John's cows like to play coin games so FJ has invented with a new two-player coin game c ...
随机推荐
- vx小程序(1)
一.程序配置 app.json 1. pages字段——用于描述当前小程序的页面路径. 2.window字段——定义小程序所有页面的顶部背景颜色,文字颜色等. 注意:可以在pages/logs目录下的 ...
- 【API进阶之路6】一个技术盲点,差点让整个项目翻车
上次教了实习生一个方案之后,这小子跟运营妹子的关系是越走越近,时不时地撒把狗粮,在我司真正实现了研发运营一家亲~(上回你没看?戳上文剧情回顾:万万没想到,一个技术方案帮实习生追到了运营妹子) 这回想跟 ...
- 状压DP之中国象棋
题目 传送们 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方 ...
- os.environ的详解
我们想要用Python获得一些有关系统的各种信息的时候就不得不想到os的environ,那这里面都具体包含了那些内容呢? 简介 对于官方的解释,environ是一个字符串所对应环境的映像对象.这是什么 ...
- 14.刚体组件Rigidbody
刚体组件是物理类组件,添加有刚体组件的物体,会像现实生活中的物体一样有重力.会下落.能碰撞. 给物体添加刚体: 选中游戏物体->菜单Component->Physics->Rigid ...
- 最近用unity写三消游戏,mark一个准备用的unity插件,用来控制运动。
http://www.pixelplacement.com/itween/index.php itween 听说还不错!
- Zip破解工具Fcrackzip使用简介
0x00 fcrackzip简单介绍 fcrackzip是一款专门破解zip类型压缩文件密码的工具,工具小巧方便.破解速度快,能使用字典和指定字符集破解,适用于linux.mac osx 系统 0x0 ...
- Vue 的响应式原理中 Object.defineProperty 有什么缺陷?
Object.defineProperty只能劫持对象的属性,从而需要对每个对象,每个属性进行遍历,如果,属性值是对象,还需要深度遍历.Proxy可以劫持整个对象,并返回一个新的对象. Proxy不仅 ...
- Typora上传图片设置
Typora上传图片设置 问题 使用Typora写文档时上传图片的路径默认是本地磁盘的路径,这样就导致一个问题,当写好的文档上传到blog.csdn等博客网站时,会导致图片失效无法识别的问题. 解决方 ...
- DVWA学习记录 PartⅡ
Command Injection 1. 题目 Command Injection,即命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的. 2. Low a. 代码分析 ...