「模拟赛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)头奶牛中尽可能多地选些产奶.但是如果选中的奶牛携 ...
随机推荐
- MFC鼠标键盘消息处理
void CMainWindow::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags ){ )&&(GetKeyState(VK_LBUT ...
- sqlserver 使用维护计划备份
https://www.cnblogs.com/teafree/p/4240040.html
- EF CODEFIRST WITH ORACLE
摸索了半天,运行通过了,但是还是有一点坑的,对于初次使用的人来说,可能会遇到几个问题 首先安装两个dll 如果你已经下载好了dll Oracle.ManagedDataAccess.dll Oracl ...
- python爬虫(8)--Xpath语法与lxml库
1.XPath语法 XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历.XPath 是 W3C XSLT 标准的主要元素,并且 XQuery ...
- redis的特性
- java中sleep和join和yield和wait和notify的区别
1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...
- ViewPager的使用方法
首先是 导入jar包 下载地址:android-support-v4.jar 布局文件里添加viewPager布局 [html] view plaincopy <android.suppor ...
- 返回键的复写onBackPressed()介绍
本篇文章是对Android中返回键的复写onBackPressed()进行了详细的分析介绍,需要的朋友参考下 在android开发中,当不满足触发条件就按返回键的时候,就要对此进行检测.尤其是当前Ac ...
- Java-马士兵设计模式学习笔记-迭代器模式-模仿Collectin ArrayList LinckedList
Java Iterator模式 Java Iterator模式, 模仿Collectin ArrayList LinckedList 一.有如下几个类 1.接口Collection.java 2.接口 ...
- 100722E The Bookcase
传送门 题目大意 给你一些书的高度和宽度,有一个一列三行书柜,要求放进去书后,三行书柜的高的和乘以书柜的宽度最小.问这个值最小是多少. 分析 我们可以先将所有书按照高度降序排好,这样对于每一层只要放过 ...