【题解】[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 ...
随机推荐
- vue 里bus的使用
兄弟组件之间进行传值(非父子组件): 安装:npm install vue-bus 在main.js中引入vue-bus import Vue from 'vue'; import VueBus fr ...
- viewPager2的Bug
在使用数据绑定时,viewpager2的 android:layout_width 必需 match_parent,不然要么显示不正常,要么直接崩溃.
- PHP to .NET Compiler
官网 https://github.com/peachpiecompiler/peachpie 非官方简介 https://blog.csdn.net/sD7O95O/article/details/ ...
- Oracle12C配置对外访问
Oracle12C配置对外访问 第一步: 开放端口或者关闭防火墙 第二步: 配置Oracle net manager打开Net manager 修改为共享服务器 第三步: 配置连接数打开Databas ...
- 20190928-01Redis五大数据类型之Hash和Zset 000 029
- Repeater每行绑定事件代码
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { Repea ...
- java+swing+mysql图书管理系统
系统说明:本系统采用eclipse开发,IDEA,eclipse,myeclipse均可运行 界面采用swing实现 数据库:mysql,附sql代码,其余数据库可复制sql代码运行 数据库连接文件m ...
- 【NOIP2014模拟】高级打字机
题目描述 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作: T x:在文章末尾打下一个小写字母x.(typ ...
- Apache和分布式部署
1.tomcat分布式部署 1.1.要配置几个tomcat,就部署几个相同程序名的tomcat 1.2.配置每个tomcat下server.xml中ajp端口,以及后面的jvmRoute,第几个就配置 ...
- HTML全局属性(global attribute)有哪些(包含H5)
1.accesskey:提供了为当前元素生成键盘快捷键的提示.这个属性由空格分隔的字符列表组成.浏览器应该使用在计算机键盘布局上存在的第一个. 2.autocapitalize:控制用户的文本输入是否 ...