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的更多相关文章

  1. tyvj P1075 - 硬币游戏 博弈DP

    P1075 - 硬币游戏 From price    Normal (OI)总时限:10s    内存限制:128MB    代码长度限制:64KB 背景 Background 农民John的牛喜欢玩 ...

  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 ...

  3. P2964 [USACO09NOV]硬币的游戏A Coin Game (DP)

    题意:n颗硬币 两个人从前往后按顺序拿 如果上一个人拿了i颗 那么下一个可以拿1-2*i颗 问先手能获得的最大收益 题解:比较典型的最大最小最大最小..DP了 但是暴力做的话是n^3 所以就体现出了这 ...

  4. 洛谷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 ...

  5. 计蒜客 取数游戏 博弈+dp

    题目链接 取数游戏 思路:dp(x, y)表示先手在区间[x, y]能取得的最大分数.当先手取完,就轮到后手去,后手一定会选择当前能令他得到最大分数的策略,其实当先手在[x, y]区间两端取走一个数, ...

  6. [USACO09NOV]硬币的游戏A Coin Game

    https://daniu.luogu.org/problemnew/show/P2964 dp[i][j] 表示桌面上还剩i枚硬币时,上一次取走了j个的最大得分 枚举这一次要拿k个,转移到dp[i- ...

  7. 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 ...

  8. 【P2964】硬币的游戏(DP+前缀和)

    一道DP,思维难度真是不小. 首先对于这个题的数据,我们可以发现差不多可以支持n^2logn,但是貌似也不会有这种复杂度的线性DP(至少这个题看上去不是这样).所以我们考虑N^2做法.因为求得是价值和 ...

  9. [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 ...

随机推荐

  1. APP开发---Windows查看端口是否被占用

    前言:在后台设计的过程中,当你把后台的代码编辑好之后经常会发现,上传jar包之后,却出现了错误,错误结果显示端口被占用,下面就是如何查看Windows端口是否被占用的方法总结 ------------ ...

  2. [JAVA]移位运算(左移<<,右移>>和无符号右移>>>)

    一.背景知识 整数在内存中是以二进制的形式存在的,而且存的是该整数的补码.最高位代表符号位,正数为0,负数为1 正数的补码是其二进制本身,负数的补码则是 符号位保持1不变,其他位按位取反再加1,+0和 ...

  3. 一篇夯实一个知识点系列--python生成

    写在前面 本系列目的:一篇文章,不求鞭辟入里,但使得心应手. 迭代是数据处理的基石,在扫描内存无法装载的数据集时,我们需要一种惰性获取数据的能力(即一次获取一部分数据到内存).在Python中,具有这 ...

  4. 百万级别数据Excel导出优化

    前提 这篇文章不是标题党,下文会通过一个仿真例子分析如何优化百万级别数据Excel导出. 笔者负责维护的一个数据查询和数据导出服务是一个相对远古的单点应用,在上一次云迁移之后扩展为双节点部署,但是发现 ...

  5. 数据可视化之分析篇(九)PowerBI数据分析实践第三弹 | 趋势分析法

    https://zhuanlan.zhihu.com/p/133484654 以财务报表分析为例,介绍通用的分析方法论,整体架构如下图所示: (点击查看大图) 我会围绕这五种不同的方法论,逐步阐述他们 ...

  6. JavaScript:父页面与Iframe页面方法互调

    父页面调用Iframe页面中的函数 以上是父页面中定义的iframe,注意添加name属性 在父页面中调用mapFrame的ShowMyLocation方法 Iframe页面调用父页面的方法 直接在I ...

  7. java中int相除取小数点后两位或限定位数

    java 两个整数相除保留两位小数: http://blog.sina.com.cn/s/blog_624d755d0101cvuq.html java中,当两个整数相除时,由于小数点以后的数字会被截 ...

  8. Python+selenium+unittest+HTMLTestReportCN单元测试框架分享

    分享一个比较基础的,系统性的知识点.Python+selenium+unittest+HTMLTestReportCN单元测试框架分享 Unittest简介 unittest是Python语言的单元测 ...

  9. Jexl表达式引擎-根据字符串动态执行JAVA.md

    Table of Contents generated with DocToc 一.使用场景 二.市面上表达式引擎比较 2.1 Aviator 2.2 Jexl 一.使用场景 在做某些项目的时候,有时 ...

  10. Java中使用断言

    由于断言在Java程序中用于开发和测试阶段,考虑到以后很有可能会用到,在此先记类一下. 在Java语言中,给出了3种处理系统错误的机制: 1.抛出一个异常 2.日志 3.使用断言 什么时候使用断言呢? ...