Codeforces 题面传送门 & 洛谷题面传送门

首先这个消消乐的顺着消的过程看起来有点难受,DP 起来有点困难。考虑对其进行一个转化:将所有出场的人按照攻击力从小到大合并,然后每次将两个攻击力为 \(l\) 的合并为一个攻击力为 \(l+1\) 的人,答案加上 \(c_{l+1}\),如果发现攻击力为 \(l\) 的人 \(\le 1\) 那就继续合并攻击力为 \(l+1\) 的人,不难发现这个过程与原题的过程等价。

接下来考虑如何 DP 求解原问题。我们将序列翻转,这样单调不减就可以转化为单调不升,方便我们的合并过程。设 \(dp_{x,i,j}\) 表示当前考虑了前 \(x\) 个人,合并到攻击力 \(=i\) 的人,目前攻击力 \(=i\) 的人有 \(j\) 个,转移就新加入一个人时,令 \(dp_{x,l_x,j+1}\leftarrow dp_{x-1,l_x,j}-s_x+c_{l_x}\),然后从 \(l_x\) 开始往 \(n\) 枚举更新合并的贡献即可,具体来说 \(dp_{x,i+1,j/2}\leftarrow dp_{x,i,j}+\dfrac{j}{2}·c_{i+1}\)。你可能会疑惑为什么不直接一次性合并完所有攻击力为 \(i\) 的人直到不能合并为止,这是因为你有可能出现合并到一半又进来了新的人的情况,这种情况下就要一步步合并。\(x\) 那一维可以去掉这样空间复杂度可以达到平方。直接转移单次复杂度是 \(n^2\) 的,总复杂度 \(n^3\),无法通过。不过注意到在合并的过程中,我们的 \(j\) 只可能达到 \(\dfrac{x}{2^{i-l_x}}\),因此 \(j\) 的枚举只用枚举到 \(\dfrac{x}{2^{i-l_x}}\) 即可,这样总复杂度就是平方。

const int MAXN=2000;
int n,m,l[MAXN+5],s[MAXN+5],dp[MAXN*2+5][MAXN+5],c[MAXN*2+5];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&l[i]);
for(int i=1;i<=n;i++) scanf("%d",&s[i]);
for(int i=1;i<=n+m;i++) scanf("%d",&c[i]);
memset(dp,192,sizeof(dp));
for(int i=1;i<=n+m;i++) dp[i][0]=0;
for(int i=n;i;i--){
for(int j=n;j;j--) chkmax(dp[l[i]][j],dp[l[i]][j-1]+c[l[i]]-s[i]);
for(int j=l[i];j<=n+m;j++) for(int k=0;k<=(n>>(j-l[i]));k++)
chkmax(dp[j+1][k>>1],dp[j][k]+1ll*(k>>1)*c[j+1]);
} printf("%d\n",dp[n+m][0]);
return 0;
}

Codeforces 1322D - Reality Show(DP)的更多相关文章

  1. Codeforces Gym101341K:Competitions(DP)

    http://codeforces.com/gym/101341/problem/K 题意:给出n个区间,每个区间有一个l, r, w,代表区间左端点右端点和区间的权值,现在可以选取一些区间,要求选择 ...

  2. codeforces 711C Coloring Trees(DP)

    题目链接:http://codeforces.com/problemset/problem/711/C O(n^4)的复杂度,以为会超时的 思路:dp[i][j][k]表示第i棵数用颜色k涂完后bea ...

  3. codeforces#1154F. Shovels Shop (dp)

    题目链接: http://codeforces.com/contest/1154/problem/F 题意: 有$n$个物品,$m$条优惠 每个优惠的格式是,买$x_i$个物品,最便宜的$y_i$个物 ...

  4. Codeforces 1051 D.Bicolorings(DP)

    Codeforces 1051 D.Bicolorings 题意:一个2×n的方格纸,用黑白给格子涂色,要求分出k个连通块,求方案数. 思路:用0,1表示黑白,则第i列可以涂00,01,10,11,( ...

  5. Codeforces 1207C Gas Pipeline (dp)

    题目链接:http://codeforces.com/problemset/problem/1207/C 题目大意是给一条道路修管道,相隔一个单位的管道有两个柱子支撑,管道柱子高度可以是1可以是2,道 ...

  6. Codeforces 704C - Black Widow(dp)

    Codeforces 题目传送门 & 洛谷题目传送门 u1s1 感觉这种题被评到 *2900 是因为细节太繁琐了,而不是题目本身的难度,所以我切掉这种题根本不能说明什么-- 首先题目中有一个非 ...

  7. Codeforces 682B New Skateboard(DP)

    题目大概说给一个数字组成的字符串问有几个子串其代表的数字(可以有前导0)能被4整除. dp[i][m]表示字符串0...i中mod 4为m的后缀的个数 通过在i-1添加str[i]字符转移,或者以st ...

  8. Codeforces 543D Road Improvement(DP)

    题目链接 Solution 比较明显的树形DP模型. 首先可以先用一次DFS求出以1为根时,sum[i](以i为子树的根时,满足要求的子树的个数). 考虑将根从i变换到它的儿子j时,sum[i]产生的 ...

  9. Codeforces 543C Remembering Strings(DP)

    题意比较麻烦 见题目链接 Solution: 非常值得注意的一点是题目给出的范围只有20,而众所周知字母表里有26个字母.于是显然对一个字母进行变换后是不影响到其它字符串的. 20的范围恰好又是常见状 ...

随机推荐

  1. 源码解析-Abp vNext丨LocalEventBus

    前言 基础篇已经更新完了,从本篇开始我们进入,中级篇(学习部分源代码)我会挑一些我个人认为比较重要的知识点结合部分开源项目进行源码讲解,咱们废话不说直接上车. Abp vNext的事件总线分2种,一种 ...

  2. 【c++ Prime 学习笔记】第16章 模板与泛型编程

    面向对象编程(OOP)和泛型编程(GP)都能处理在编写程序时类型未知的情况 OOP能处理运行时获取类型的情况 GP能处理编译期可获取类型的情况 标准库的容器.迭代器.算法都是泛型编程 编写泛型程序时独 ...

  3. JVM:内存结构

    JVM:内存结构 说明:这是看了 bilibili 上 黑马程序员 的课程 JVM完整教程 后做的笔记 内容 程序计数器 虚拟机栈 本地方法栈 堆 方法区 直接内存 1. 程序计数器 1.1 定义 P ...

  4. UltraSoft - Beta - Scrum Meeting 9

    Date: May 25th, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 记录Scrum Meeting Liuzh 前端 用户忘记密码界面初稿完成 Kkk ...

  5. BUAA 2020 软件工程 热身作业

    BUAA 2020 软件工程 热身作业 Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 第一次作业-热身! ...

  6. git为单独的仓库设置提交的用户名

    在我们平时的学习中可能有这么一种需求,在公司进行开发的时候,一般会参与多个项目的开发,而项目提交代码时,一般请求情况下提供的用户都是同一个,而我们为了方便可能会使用全局进行git 用户名的配置.但是空 ...

  7. [经验] 电源抑制比(PSRR)的测量原理及解决方法

    PSRR(Power supply rejection ratio)又称电源抑制比,是衡量电路对于输入电源中纹波抑制大小的重要参数,表示为输出纹波和输入纹波的对数比,单位为分贝(dB)[1],其计算公 ...

  8. STM32必学的时钟系统

    STM32的时钟系统 相较于51单片机,stm32的时钟系统可以说是非常复杂了,我们现在看下面的一张图:   上图说明了时钟的走向,是从左至右的从时钟源一步步的分配给外设时钟.需要注意的是,上图左侧一 ...

  9. 攻防世界 杂项 11.simple_transfer

    题目描述: 文件里有flag,找到它. 题目分析: 文件解压后是一个抓包流量分析文件,用 wireshark 打开后,用分组字节流搜索 flag,追踪 TCP 流,可以隐约看到有 file.pdf, ...

  10. evaluate-reverse-polist-notation leetcode C++

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are+,-,*, ...