【题解】[USACO09NOV]A Coin Game S
\(\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的更多相关文章
- 【题解】284E. Coin Troubles(dp+图论建模)
[题解]284E. Coin Troubles(dp+图论建模) 题意就是要你跑一个完全背包,但是要求背包的方案中有个数相对大小的限制 考虑一个\(c_i<c_j\)的限制,就是一个\(c_i\ ...
- 题解 UVA10328 【Coin Toss】
这道题目其实就是说有N张纸牌,问至少连续K张正面朝上的可能性是多少. 可以用递推做.首先我们将题目所求从 至少K张 转化为 总数 - 至多K张 (为什么要这样自己想) 设F[i][j]为前i个纸牌至多 ...
- [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 ...
- 题解报告:hdu 2069 Coin Change(暴力orDP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2069 Problem Description Suppose there are 5 types of ...
- 题解 SP5271 XOINC - A Coin Game
SP5271 XOINC - A Coin Game 双倍经验:P2964 [USACO09NOV]硬币的游戏A Coin Game O3做法(TLE):枚举i,j,k,即剩下i枚金币,上一轮选了j枚 ...
- 洛谷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 ...
- [USACO09NOV]硬币的游戏A Coin Game
https://daniu.luogu.org/problemnew/show/P2964 dp[i][j] 表示桌面上还剩i枚硬币时,上一次取走了j个的最大得分 枚举这一次要拿k个,转移到dp[i- ...
- P2964 [USACO09NOV]硬币的游戏A Coin Game (DP)
题意:n颗硬币 两个人从前往后按顺序拿 如果上一个人拿了i颗 那么下一个可以拿1-2*i颗 问先手能获得的最大收益 题解:比较典型的最大最小最大最小..DP了 但是暴力做的话是n^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 ...
随机推荐
- java工具类去掉字符串String中的.点。android开发java程序员常用工具类
下面是工具类详细代码: package com.qq986945193.david; /** * qq986945193 Project * ============================= ...
- Idea使用方式——创建类模板
问题:创建类或接口时,要添加自定义的默认注释,比如版本,时间等.每个类修改显然不符合程序员的思路,有没有办法通过定义模板来实现? 使用Idea模板 Idea可听过创建类模板来实现. 功能路径:Sett ...
- 【jmespath】—3. 进阶 Object Projections
继续,来看Object Projections. 一.Object Projections 上面说的是列表投影,只适用于列表.那么对于json对象,可以用对象投影. 投影最终返回的仍然是个列表,只不过 ...
- Ignatius and the Princess IV (水题)
"OK, you are not too bad, em... But you can never pass the next test." feng5166 says. &qu ...
- Java使用POI的SXSSFWorkbook与HSSFWorkbook导出复杂表头
一.HSSFWorkbook与SXSSFWorkbook的区别: HSSFWorkbook是对Excel2003以前的版本进行操作的,即后缀名为.xls SXSSFWorkbook时对Excel200 ...
- 写Junit测试时用Autowired注入的类实例始终为空怎么解?
踩坑半天多,终于在网上寻觅到了解决方案,特此分享一下. 重要前提:src/main/java下的根包名必须和src/test/main的根包名完全一致,否则就会发生死活不能注入的情况,要继续进行下面的 ...
- GuestOS? HostOS?
起因 今天在网上看到一篇文章 有几个陌生的关键词不太熟悉,就随笔记一下. 名词解释 # OS :操作系统 # VM(虚拟机) 里的OS 称为 GuestOS # 物理机 ...
- leetcode刷题-52N皇后2
题目 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击.给定一个整数 n,返回 n 皇后不同的解决方案的数量. 思路 与51题完全一致 实现 class ...
- JS语法_其他
严格模式 let obj = { name: 'oceans', } function f1() { with (obj) { console.log(name) } } function f2() ...
- 【Flutter 实战】菜单(Menu)功能
老孟导读:今天介绍下Flutter中的菜单功能. PopupMenuButton 使用PopupMenuButton,点击时弹出菜单,用法如下: PopupMenuButton<String&g ...