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. Fragment 1.2.0 更新记录

    1.官方地址 https://developer.android.com/jetpack/androidx/releases/fragment 2.引入方法 dependencies { def fr ...

  2. 白嫖码云Pages,两分钟的事,就能搭个百度能搜到的个人博客平台

    为了攒点钱让女儿做个富二代(笑),我就没掏钱买服务器,白嫖 GitHub Pages 搭了一个博客平台.不过遗憾的是,GitHub Pages 只能被谷歌收录,无法被百度收录,这就白白损失了一大波流量 ...

  3. Idiomatic Phrases Game(最短路+注意坑点)

    Tom is playing a game called Idiomatic Phrases Game. An idiom consists of several Chinese characters ...

  4. 牛顿迭代法解非线性方程组(MATLAB版)

    牛顿迭代法,又名切线法,这里不详细介绍,简单说明每一次牛顿迭代的运算:首先将各个方程式在一个根的估计值处线性化(泰勒展开式忽略高阶余项),然后求解线性化后的方程组,最后再更新根的估计值.下面以求解最简 ...

  5. Maven 仓库镜像设置

    <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>al ...

  6. 2048游戏 - C语言不引入图形库简单实现

    声明:本程序绝大部分属于原创,交互部分参考了博客园 Judge Young的原创文章 游戏2048源代码 - C语言控制台界面版, 作者Judge Young的算法思想非常值得参考,感谢作者的分享 附 ...

  7. Nginx及其架构设计

    1.1. 什么是 Nginx Nginx 是俄罗斯人编写的十分轻量级的 HTTP 服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个 IMAP/P ...

  8. Oracle Rman备份恢复和管理

    参考资料: Oracle之Rman入门指南 一步一步学Rman Rman简介 Rman-Recover manager恢复管理工具. Oracle集成了很多环境的一个数据库备份和恢复的工具. Rman ...

  9. 安装paddle的问题,报错Can not find library: libcudnn.so. The process maybe hang.

    今天在服务器上安装paddle的GPU版时报错 报错截图如下: 其实报错已经提示的很明显了,就是要添加一个环境变量.但我想到我之前并没有在全局环境下安装cudnn,以为是这个原因.因为之前安装pyto ...

  10. 项目初始化CSS公共样式

    /*! normalize.css v6.0.0 | MIT License | github.com/necolas/normalize.css */ /* Document =========== ...