Link

\(\text{Solution:}\)

菜鸡自己想出来了状态设计,但是没有实现出来……菜死了

设\(dp[i][j]\)表示该选第\(i\)个,最多选\(j\)个的最优解。注意这里的定义仅仅是最优解,而不是先手最优。

那么,对于每一个\(dp[i][j]\)都要由下一步的\(dp[i+x][x+x]\)转移而来。注意的是,每一步的先后手不一样。所以轮到对方的时候要用剩下的石子数减去对方的最优解。因为对方选的最优,同时意味着我们在那部分也是最优的,一减就是了。

于是,我们可以枚举起点,枚举范围,再枚举选的个数,大力\(dp.\)然而超时无疑。

观察得到,\(dp[i][j]\)包括\(dp[i-1][j]\)(注意这里还是自己选),而这个\(dp[i-1][j]\)也就是比自己少枚举了一个\(dp[x+lim][lim+lim]\),至于这一句怎么理解:

对于暴力,我们枚举的是,一个初始值再从\(1\to lim\)来枚举选择的数量。这里可以看做,一个\(dp[i-1][lim]\)已经包含了枚举的\(1\to lim-1\),只差一个\(lim\)就行了。

这里看做一个从前向后推,用了那一句话代表了枚举的那些\(\text{dfs}\).于是省了这些循环。

那么我们省下来一重循环,时间可过。略微卡空间,省着点。

#include<bits/stdc++.h>
using namespace std;
int n,c[2001],sum[2001];
int dp[2000][2000];
int dfs(int x,int lim){
lim=min(lim,n-x+1);//边界
if(~dp[x][lim])return dp[x][lim];//已搜索过了
if(x+lim>n)return sum[x];//一次选完即可,这里是当前这一部分的最优解,不是全局
if(!lim)return 0;//没路可走滚回去)
int ans=dfs(x,lim-1);//dp[x][lim-1],这一步还是轮到我方走
ans=max(ans,sum[x]-dfs(x+lim,lim<<1));//这里之所以用全部减去这部分,是因为这一部分的dfs依旧在dp,它的结果是后面部分的最优解,减去就是当前这一部分所选择的
return dp[x][lim]=ans;//继续上面:上面那个东西算的是对方的最优,因为这里的状态定义并不是自己最优,而是当前执子方最优
//自己已经选择了要lim这部分,那剩下的既然对手最优了,对手选完的就是自己的了。
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d",c+i);
for(int i=n;i>=1;--i)sum[i]=sum[i+1]+c[i];
memset(dp,-1,sizeof(dp));
printf("%d\n",dfs(1,2));
return 0;
}

【题解】[USACO09NOV]A Coin Game S的更多相关文章

  1. 【题解】284E. Coin Troubles(dp+图论建模)

    [题解]284E. Coin Troubles(dp+图论建模) 题意就是要你跑一个完全背包,但是要求背包的方案中有个数相对大小的限制 考虑一个\(c_i<c_j\)的限制,就是一个\(c_i\ ...

  2. 题解 UVA10328 【Coin Toss】

    这道题目其实就是说有N张纸牌,问至少连续K张正面朝上的可能性是多少. 可以用递推做.首先我们将题目所求从 至少K张 转化为 总数 - 至多K张 (为什么要这样自己想) 设F[i][j]为前i个纸牌至多 ...

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

  4. 题解报告:hdu 2069 Coin Change(暴力orDP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2069 Problem Description Suppose there are 5 types of ...

  5. 题解 SP5271 XOINC - A Coin Game

    SP5271 XOINC - A Coin Game 双倍经验:P2964 [USACO09NOV]硬币的游戏A Coin Game O3做法(TLE):枚举i,j,k,即剩下i枚金币,上一轮选了j枚 ...

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

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

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

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

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

  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. linux 下切换Python版本(某用户,共存,替换)

    当你安装 Debian Linux 时,安装过程有可能同时为你提供多个可用的 Python 版本,因此系统中会存在多个 Python 的可执行二进制文件.你可以按照以下方法使用 ls 命令来查看你的系 ...

  2. 【小白学PyTorch】7 最新版本torchvision.transforms常用API翻译与讲解

    文章来自:微信公众号[机器学习炼丹术].欢迎关注支持原创 也欢迎添加作者微信:cyx645016617. 参考目录: 目录 1 基本函数 1.1 Compose 1.2 RandomChoice 1. ...

  3. Agumaster添加股票日交易爬虫画面

  4. 通达OA任意用户登录漏洞复现

    前言 今年hw挺火爆的,第一天上来就放王炸,直接搞得hw暂停 昨天晚上无聊,复现了一下通达oa的洞,也有现成的exp可以使用,比较简单 0x00 漏洞概述 通达OA是一套国内常用的办公系统,此次发现的 ...

  5. graph attention network(ICLR2018)官方代码详解(tensorflow)-稀疏矩阵版

    论文地址:https://arxiv.org/abs/1710.10903 代码地址: https://github.com/Diego999/pyGAT 之前非稀疏矩阵版的解读:https://ww ...

  6. oracle之SQL的数据类型

    SQL的数据类型 3.1 四种基本的常用数据类型(表的字段类型) 1.字符型, 2.数值型,3.日期型,4.大对象型 3.1.1 字符型:    char         固定字符,最长2000个   ...

  7. [算法]类似n sum个数的问题(DP)

    题目 求和为target的数组元素组合数,含重复. 例: 输入 arr = { 1, 2, 3, 3, 4 } ,target = 6 输出 4 题解 dp[i][j]代表到数组第i-1个元素,目标和 ...

  8. vue-element-admin改造接入后台,搭建有来商城youlai-mall前后端分离管理平台

    一. 前言 本篇基于有来商城youlai-mall微服务项目搭建的后台前端管理平台,技术选型Vue+Element-UI实现前后端分离,解决方案选型vue-element-admin.希望通过本篇你可 ...

  9. command三国杀开发日记20200914

    目前状态 一时脑热开始写的东西,计划完全使用C语言实现,尽量使用通用接口,能够在windows上直接运行 几乎是一穷二白,初步搭建了牌堆.玩家信息接口体,编写了简单的UI函数,能够将玩家信息显示在屏幕 ...

  10. P1295 [TJOI2011]书架 线段树优化dp,单调栈

    P1295 [TJOI2011]书架 本题思路比较好想(对我来说不是),但代码细节很多,奈何洛谷的题解只有思路,然后就是 没有丝毫解释的代码,让人看起来很头疼(~~ 尤其是像我这样的蒟蒻~~),所以便 ...