「模拟赛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)头奶牛中尽可能多地选些产奶.但是如果选中的奶牛携 ...
随机推荐
- 阿里云服务器ubuntu安装redis2.8.13
阿里云服务器ubuntu安装redis2.8.13 2014-09-04 16:14 | coding云 | 2198次阅读 | 暂无评论 一.下载redis 可以先下载到本地,然后ftp到服 ...
- ABP缓存
简介 缓存是做什么的? 简单的可以认为是一个键值对的数据存于内存中,高速读取.作用为了减少和数据库的交互 Abp中缓存的使用 public class InvoiceAppService : Appl ...
- MXF文件结构浅析
MXF是英文Material eXchange Format(素材交换格式)的缩语.MXF是SMPTE(美国电影与电视工程师学会)组织定义的一种专业音视频媒体文件格式.MXF主要应用于影视行业媒体制作 ...
- 解决html中的乱码问题
1.最简单粗暴的方法就是加一个meta标签,不过值得我们注意的是我们的meta标签是与我们的head标签是同一级的,所以千万不能将meta标签加到我们的head标签中. <meta http-e ...
- AndroidImageSlider(图片轮播控件)
1,引入 dependencies { compile "com.android.support:support-v4:+" compile 'com.squareup.picas ...
- JavaScript的作用域与闭包
JavaScript的作用域以函数为界,不同的函数拥有相对独立的作用域.函数内部可以声明和访问全局变量,也可以声明局部变量(使用var关键字,函数的参数也是局部变量),但函数外部无法访问内部的局部变量 ...
- 用StringBuilder来实现经典的反转问题
import java.util.Scanner; public class Practise03 { public static void main(String[] args) { //键盘录入一 ...
- 基于IFC的大型三维城市群体——智慧城市模拟
- Blender 工具使用——模式切换
Blender 工具使用--模式切换 制作骨架时 在物件模式(Object Mode)下使用鼠标右键选中一个骨架,按Tab键,可以切换为编辑模式(Edit Mode),按Ctrl + Tab可以进入骨 ...
- 使用RSS提升DPDK应用的性能(转)
本文描述了RSS以及在DPDK中如何配置RSS达到性能提升和统一分发. 什么是RSS RSS(Receive Side Scaling)是一种能够在多处理器系统下使接收报文在多个CPU之间高效分发的网 ...