萌萌题:一道结合了观察性质的线性 dp。

观察

我们先考虑极端情况:所有数相同,所有数降序排列两种情况。

对于所有数相同的情况,我们发现,最终可以合并出来的区间,最多只有 \(n \log n\) 个。

怎么证明?考虑固定右端点,那么我们想要合并出一个点,就得选 \(2^k\) 个数出来,这就有 \(\log n\) 次选择方式。总的来说就是有 \(n \log n\) 种选数方式了。

所有数降序排列是多少?我们只需要将最后两个元素合并,然后继续往前面合并即可。总体来说有 \(n\) 个。

dp 设计

这题还有个很重要的观察:对于固定了右端点的时候,假设我们要让这个数增加 \(v\),那么合并的方案(区间)一定是唯一的。这就启发了我们可以设计一个 dp,定义 \(dp_{i,j}\) 表示让元素 \(i\) 增加 \(j\) 后,合并到的区间的左端点的前一个数是哪里。

为什么要前一个数?其实你不要这前一个数其实也可以做。只不过我这样设计来讲比较好写转移的代码。

接下来就是很显然的转移,假设目前合并到的区间的左端点的前一个数为 \(now\),要增加 \(v\):

\[dp_{i,v}=dp_{now,a_{now}-(a_i+v-1)}
\]

然后记录一下合法状态就好了。

这样写对吗?实际上假了。这是我赛时的做法,当时误以为一个数最多增量只可能是 \(\log n\)。实际上降序排列就能把增量卡到 \(n\)。

那么开大小为 \(n\) 的增量可不可以?直接开肯定不行,会 MLE,但是动态开不就行了?根据前面的观察,我们最多只有 \(n \log n\) 个合法区间,那么每个数的增量也最多只有 \(n \log n\) 个,我们用 vector 模拟动态开 dp 数组的过程,这道题就 AC 了。

注意,当某个区间无法继续合并下去的时候,要立刻 break,才能保证复杂度正确,否则会退化为平方级别。

时间复杂度为 \(O(n\log n)\)。

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pi;
int n,a[100005],ans=0;
vector<int>dp[100005];
int main()
{
freopen("cute.in","r",stdin);
freopen("cute.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)
{
dp[i].emplace_back(i-1);
for(int j=1;j<=100000;j++)
{
int now=dp[i][j-1];
int ta=a[now];
int dt=a[i]+j-1-ta;
if(dt>=0&&dt<dp[now].size())dp[i].emplace_back(dp[now][dt]);
else break;
}
}
for(int i=1;i<=n;i++)ans=max(ans,a[i]+int(dp[i].size())-1);
cout<<ans<<endl;
return 0;
}

Hetao P1031 萌萌题 题解 [ 蓝 ] [ 线性 dp ]的更多相关文章

  1. 【AHOI2009】中国象棋 题解(线性DP+数学)

    前言:这题主要是要会设状态,状态找对了问题迎刃而解. --------------------------- 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可 ...

  2. 【好好补题,因为没准题目还会再出第三遍!!】ACM字符串-组合数学(官方题解是数位DP来写)

    ACM字符串 .长度不能超过n .字符串中仅包含大写字母 .生成的字符串必须包含字符串“ACM”,ACM字符串要求连在一块! ok,是不是很简单?现在告诉你n的值,你来告诉我这样的字符串有多少个 输入 ...

  3. 单调队列+线性dp题Watching Fireworks is Fun (CF372C)

    一.Watching Fireworks is Fun(紫题) 题目:一个城镇有n个区域,从左到右1编号为n,每个区域之间距离1个单位距离节日中有m个烟火要放,给定放的地点ai,时间ti当时你在x,那 ...

  4. cf909C 线性dp+滚动数组好题!

    一开始一直以为是区间dp.. /* f下面必须有一个s 其余的s可以和任意f进行匹配 所以用线性dp来做 先预处理一下: fffssfsfs==>3 0 1 1 dp[i][j] 表示第i行缩进 ...

  5. [线性DP][codeforces-1110D.Jongmah]一道花里胡哨的DP题

    题目来源: Codeforces - 1110D 题意:你有n张牌(1,2,3,...,m)你要尽可能多的打出[x,x+1,x+2] 或者[x,x,x]的牌型,问最多能打出多少种牌 思路: 1.三组[ ...

  6. 洛谷P1140 相似基因(线性DP)

    题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类 ...

  7. 线性dp

    线性dp应该是dp中比较简单的一类,不过也有难的.(矩乘优化递推请出门右转) 线性dp一般是用前面的状态去推后面的,也有用后面往前面推的,这时候把循环顺序倒一倒就行了.如果有的题又要从前往后推又要从后 ...

  8. ACM ICPC 2018 青岛赛区 部分金牌题题解(K,L,I,G)

     目录: K Airdrop I Soldier Game L Sub-cycle Graph G Repair the Artwork ———————————————————— ps:楼主脑残有点严 ...

  9. [CodeForces - 1272D] Remove One Element 【线性dp】

    [CodeForces - 1272D] Remove One Element [线性dp] 标签:题解 codeforces题解 dp 线性dp 题目描述 Time limit 2000 ms Me ...

  10. P3387缩点(tarjan+拓扑排序+线性dp)

    题目描述 给定一个 n个点 m 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次. 输入 ...

随机推荐

  1. qnap nas 下的 nasconfig_fs.img.tgz 及相关的一点记录

    QNAP NAS 已安装EntWare(先前的Optware已废弃,不适用),可以使用 opkg 命令安装软件包(如想利用arp命令查看局域网的IP地址及对应物理网卡地址,可使用opkg instal ...

  2. Win10使用SSH反向隧道(端口转发)连接远程桌面

    应用场景: 如果你有Linux云主机(腾讯.华为等),且公司有一台只有内网IP (或动态IP) 的Win10工作机:你计划在家里工作时,通过家里的电脑连接公司的工作机 (且不想使用类似Teamview ...

  3. Java日志手机号脱敏工具类

    背景 在开发过程中,很容易将用户敏感信息,例如手机号码.身份证等,打印在日志平台.为了保护用户数据,又不影响日志的打印,需要将日志中的敏感信息进行脱敏. 效果 没看明白,强烈建议 pull项目,执行一 ...

  4. 一文聊清楚Redis主从复制原理

    本地缓存带来的挑战 分布式缓存相比于本地缓存,在实现层面需要关注的点有哪些不同.梳理如下: 维度 本地缓存 集中式缓存 缓存量 受限于单机内存大小,存储数据有限 需要提供给分布式系统里面所有节点共同使 ...

  5. elastic8.4.0搜索+logstash<=>mysql实时同步+kibana可视化操作+netcore代码笔记

    做全文搜索,es比较好用,安装可能有点费时费力.mysql安装就不说了.主要是elastic8.4.0+kibana8.4.0+logstash-8.16.1,可视化操作及少了netcore查询代码. ...

  6. 基于云主机的ModelArts模型训练实践,让开发环境化繁为简

    本文分享自华为云社区<[开发者空间实践]云主机安装Docker并制作自定义镜像在ModelArts平台做模型训练>,作者: 开发者空间小蜜蜂. 1.1 案例介绍 在AI业务开发以及运行的过 ...

  7. vue组件传参props

    传参格式,将需要传的参数以属性方式写在组件标签上 //组件标签 <zu a='参数一' b='参数b'></zu> 接收格式,在组件内 //props属性接收参数 props: ...

  8. 企业IT基础资源管理的“帮帮团”上线啦——源启云原生基础设施管理平台

    为助力企业提升基础资源一体化管理和交付效率,以更先进的基础设施管理方式来满足现代企业业务持续扩展和复杂化的需要,中电金信运用基础设施即代码(Infrastructure as Code,简称IaC)技 ...

  9. Spring AOP实例操作 简单易懂

    AOP的功能,不改变源代码可以增强类中的方法      (增强 = 代理) AOP切入点表达式: execution([权限修饰符] [返回值类型] [类全路径] [方法名称] ([参数列表])) 例 ...

  10. WPS在ArchLinux常见问题

    问题简述wps在aur源上有包,直接下载安装即可,但是通过包管理器安装的wps会出现一些奇怪的问题,我遇到的有两个: wps在打开时提示缺少字体wps word不能导出pdf文档,同时wps pdf也 ...