「模拟赛20181025」御风剑术 博弈论+DP简单优化
题目描述
Yasuo 和Riven对一排\(n\)个假人开始练习。斩杀第\(i\)个假人会得到\(c_i\)个精粹。双方轮流出招,他们在练习中互相学习,所以他们的剑术越来越强。基于对方上一次斩杀的假人数量\(k\),可以斩杀掉剩余假人中位置最靠前的\([1,2k]\)范围内数量的连续假人。最初Yasuo先出招,斩杀\(1\)或\(2\)个假人。Yasuo偷偷把你叫到一边,问在双方都采取最优策略的情况下, 他最多能够获取多少精粹。
输入
第一行一个正整数\(n\),表示假人的个数。
接下来\(n\)行,每行一个正整数\(c_i\)表示斩杀每个假人获得的精粹数。
输出
一个正整数表示 Yasuo 能够得到的最大精粹数量。
样例输入
5
1
3
1
7
2
样例输出
9
样例解释
Yasuo 斩\(1\)号,Riven 斩\(2\)号,Yasuo 斩\(3,4\)号,Riven 斩\(5\)号。
数据范围
对于前\(10\%\)的数据,\(n \leq 10\)
对于前\(40\%\)的数据,\(n \leq 500\)
对于\(100\%\)的数据,\(5 \leq n \leq 5000, ci \leq 10^9\)
题解
首先,吐槽题目背景,并吐槽搬题并魔改的出题人。
简单博弈论\(DP\),几乎不怎么涉及博弈论的知识。
显然两人其实是等价的,设\(f[i][j]\)表示现在剩下末尾的\(i\)个假人,最后一刀是砍了\(j\)个假人,能得到的最大值。显然我们可以枚举下一刀砍了多少人\(k\in[1,2j]\),\(DP\)状态的转移就会非常简单。但很遗憾,这样的复杂度是\(O(n^3)\),并不能通过所有测试点。
考虑优化,我们把\(DP\)式子写下来吧:
\(f[i][j] = max(s[i]-f[i-k][k])\),其中\(k\in[1,2j]\),\(s[i]\)表示后\(i\)个人的\(c\)之和。
化一下式子:
\(f[i][j] = max(f[i][j-1],s[i]-f[i-2j][2j],s[i]-f[i-2j+1][2j-1])\)
然后就没了……
\(Code:\)
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 5005
#define ll long long
#define inf (1ll << 50)
template<typename Mytype>void Read(Mytype &p)
{
p = 0;
char c = getchar();
for (; c < '0' || c > '9'; c = getchar());
for (; c >= '0' && c <= '9'; c = getchar())p = p * 10 + c - '0';
}
ll s[N];
ll f[5005][5005];
int n, A[N];
int main()
{
Read(n);
for (int i = 1; i <= n; i++)
Read(A[i]), s[n - i + 1] = A[i];
for (int i = 1; i <= n; i++)
s[i] += s[i - 1];
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
ll ans1 = -inf, ans2 = -inf;
if (i >= (2 * j - 1))
ans1 = s[i] - f[i - (2 * j - 1)][2 * j - 1];
if (i >= (2 * j))
ans2 = s[i] - f[i - 2 * j][2 * j];
f[i][j] = max(max(ans1, ans2), f[i][j - 1]);
}
}
printf("%lld\n", f[n][1]);
}
「模拟赛20181025」御风剑术 博弈论+DP简单优化的更多相关文章
- 「模拟赛20190327」 第二题 DP+决策单调性优化
题目描述 小火车虽然很穷,但是他还是得送礼物给妹子,所以他前往了二次元寻找不需要钱的礼物. 小火车准备玩玩二次元的游戏,游戏当然是在一个二维网格中展开的,网格大小是\(n\times m\)的,某些格 ...
- 「模拟赛20180306」回忆树 memory LCA+KMP+AC自动机+树状数组
题目描述 回忆树是一棵树,树边上有小写字母. 一次回忆是这样的:你想起过往,触及心底--唔,不对,我们要说题目. 这题中我们认为回忆是这样的:给定 \(2\) 个点 \(u,v\) (\(u\) 可能 ...
- 「模拟赛20180406」膜树 prufer编码+概率
题目描述 给定一个完全图,保证\(w_{u,v}=w_{v,u}\)且\(w_{u,u}=0\),等概率选取一个随机生成树,对于每一对\((u,v)\),求\(dis(u,v)\)的期望值对\(998 ...
- 「模拟赛20180307」三元组 exclaim 枚举+树状数组
题目描述 给定 \(n,k\) ,求有多少个三元组 \((a,b,c)\) 满足 \(1≤a≤b≤c≤n\)且\(a + b^2 ≡ c^3\ (mod\ k)\). 输入 多组数据,第一行数据组数\ ...
- 「模拟赛20191019」C 推式子+贪心+树状数组
题目描述 给定一棵\(n\)个点的有根树,根节点编号为\(1\),点有点权. 定义\(d(v)\)表示\(v\)到\(1\)的路径上的边数. 定义\(f(v,u)\)在\(v<u\)且\(v\) ...
- 「模拟赛20191019」B 容斥原理+DP计数
题目描述 将\(n\times n\)的网格黑白染色,使得不存在任意一行.任意一列.任意一条大对角线的所有格子同色,求方案数对\(998244353\)取模的结果. 输入 一行一个整数\(n\). 输 ...
- 「模拟赛20191019」A 简单DP
题目描述 给一个\(n\times m\)的网格,每个格子上有一个小写字母. 对于所有从左上角\((1,1)\)到右下角\((n,m)\)只向下或向右走的路径构成的集合,判断是否存在两条走法不同的路径 ...
- 「模拟赛 2018-11-02」T3 老大 解题报告
老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图),由于新建的办公室太大以 ...
- 【noip模拟赛5】细菌 状压dp
[noip模拟赛5]细菌 描述 近期,农场出现了D(1<=D<=15)种细菌.John要从他的 N(1<=N<=1,000)头奶牛中尽可能多地选些产奶.但是如果选中的奶牛携 ...
随机推荐
- CPU, PSU, SPU的区别
It all started in January 2005 with Critical Patch Updates (CPU). Then Patch Set Updates (PSU) were ...
- java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp区别和总结
在web开发中,避免不了对日期的操作,就几种常见的日期操作做个总结(部分参考网络,在此表示感谢): java.util.Date.java.sql.Date.java.sql.Time.java.sq ...
- jQuery实现页内锚点平滑跳转
当页面内容长多,导致页面高度过高或过宽是,浏览起来就有点费劲,不过使用了锚点平滑跳转效果可以实现页面的跳转,从而加快速浏览想要浏览的模块.具体做法如下: 首先是菜单(锚点)的写法 <a href ...
- hadoop报错java.io.IOException: Incorrect configuration: namenode address dfs.namenode.servicerpc-address or dfs.namenode.rpc-address is not configured
不多说,直接上干货! 问题详情 问题排查 spark@master:~/app/hadoop$ sbin/start-all.sh This script is Deprecated. Instead ...
- LaTex: 表格单元格内容 分行显示/换行
问题:如何同时让表格同一行一个单元格的文字能垂直居中?比如说文字超长超出页面范围需要分行显示 答:(来源于smth) 方案一: \newcommand{\tabincell}[2]{\begin{ta ...
- JAVA基础知识总结10(包类)
包:定义包用package关键字. 1:对类文件进行分类管理. 2:给类文件提供多层名称空间. 如果生成的包不在当前目录下,需要最好执行classpath,将包所在父目录定义到classpath变量中 ...
- HTML5 学习指导
HTML 语义 HTML5为我们提供了很多旨在精确描述内容的语义元素.确保你可以从它丰富的词汇中获益. <!-- bad --> <div id="main"&g ...
- 2-3 zookeeper文件夹主要目录介绍
zookeeper-3.4.11.jar.zookeeper-3.4.11.jar.md5.zookeeper-3.4.11.sha1都是通过打包或者编译之后产生的相关的文件.那么maven相关的东西 ...
- winform 打印
pageSetupDialog 打印设置,和对话框控件差不多的套路,把控件拖到窗口中后,会在下方显示, 然后在制作的菜单中找到打印设置,双击进入点击事件写代码 按照之前的套路, DialogResul ...
- UIScrollView 实现比例缩放
#import "RootViewController.h" @interface RootViewController ()<UIScrollViewDelegate> ...