一些 dp 题

news/2025/3/13 16:55:06/文章来源:https://www.cnblogs.com/Wei-Han-Fei/p/18701683

笑点解析:dp 题单还是我暑假拉的。

CF1989E

有一个任意构造的 \(a\) 序列,需要保证 \([1,k]\) 中每个数至少出现一次,\(b_i\) 定义为距离 \(a_i\) 最近不同元素的距离,求不同 \(b\) 的个数,对 \(998244353\) 取模。

\(2\leq n \leq 2\times 10^5,2\leq k \leq \min(n,10)\)

想一半看了题解。。。

首先 \(a\) 的元素具体是什么肯定不重要,我们只关心它在 \(b\) 中的分段情况,每一个分块,可以看做是一个先上升后下降的等差数列,形似 \(1,2,\dots,\frac{L}{2},\dots,2,1\),这样就是这样的段拼接在一起形成 \(b\) 序列,转移很简单,不考虑段数 \(f(i) = \sum_{j=1}^{i-1} f(j)\),这个显然可以前缀和优化。但是考虑到一个长度为 \(2\) 和两个长度为 \(1\) 的段同样都是 \(1~1\),所以每次前缀和之后需要减去重复方案。

到这里,我们还没有考虑分成至少 \(k\) 段的要求,考虑到这个 \(k\) 很小,所以我们用全部答案减去小于 \(k\) 的答案就好了,对于小于 \(k\) 的求解,我们令 \(g_{i,j}\) 表示到第 \(i\) 个位置,已经分了 \(j\) 段的方案数,\(pre_{i,j} = \sum_{k=1}^{i-1} g_{k,j}\) 做一下前缀和优化,然后每次再减一下重复情况就没了。

复杂度 \(O(nk)\)

Submission

CF833B

\(n\) 个数划分为恰好 \(k\) 段,每段的价值定义为段内不同数个数,求价值最大值。

\(1 \leq k \leq 50,1\leq n \leq 3.5\times 10^5\)

算是切了吧,代码实现参考了一下题解。

设计 \(f_{i,j}\) 表示前 \(i\) 个位置划分为 \(j\) 段的最大权,显然有转移 \(f_{i,k} = \max \left \{ f_{j-1,k-1} + \sum_{p=j}^i [pre_{a_p} < j]\right \}\),其中 \(pre_{a_i}\) 表示 \(a_i\) 上一次的出现位置,\(\max\) 中后半部分的计数就是 \([i,j]\) 区间的贡献,这样转移是 \(O(n^2k)\) 的,显然无法通过,考虑优化。

我这里还多拆了一步,把后面拆成前缀和形式其实会更好理解,但也可以不拆,我们考虑到 \(i\) 位置在 \(i-1\) 的答案对前面的答案进行添加,发现后半部分式子当且仅当 \(pre_{a_i} < j \leq i\) 时,里面的 \(j\) 会产生 \(1\) 的贡献,做一下下标位移,我们直接对 \([pre_{a_i},i-1]\) 区间的答案区间加 \(1\) 就好了,发现这个东西可以用线段树维护,所以扔上线段树,复杂度 \(O(nk\log n)\)

具体实现时,可以先枚举分割段数,每次重构线段树,代码实现相对更加简单。

Submission

P1415

给定一个数字串,在某些两个数字之间添加逗号,使形成的数列严格单调上升,并且字典序最大。

\(1 \leq l \leq 500\)

模拟赛因为 T3 唐诗结论没调出来,所以没读题。。。。

问题转化一下,显然是要求每一个位置的最靠后的分割位置,直接 dp 所暴露出的问题就是不符合严格单调上升的东西,dp 出的序列到最后不合法。所以我们需要先求出 最小起始分割位置 保证在这个位置之后划分的位置后面都是可以合法的。

我们设 \(f_i\) 表示前 \(i\) 个数拆分,最后一个数的最小划分位置为 \(f_i\),那么有转移 \(f_i = \max \left \{ j [num(f_{j-1},j-1) < num(j,i)]\right \}\),特别地,我们令 \(f_1 = 1\),这样,我们就有了 \(f_i\)

然后我们设 \(dp_i\) 表示后 \(n-i+1\) 个数拆分,第一个数的最大划分位置为 \(dp_i\),那么我们同样有转移 \(dp_i = \max_{i=1}^{f_n-1} \left \{ j [num(i,j) < num(j+1,dp_{j+1})]\right \}\),特别地,有 \(dp_{f_n} =n\)

然而这样还没有做完,我们考虑一个例子类似 1234050,正确的划分应该为 12,34,050,而我们并没有考虑最后 050 的划分,所以我们要对最后一个数的前导零做特殊处理,即令其 \(dp_i = n\)

复杂度 \(O(n^3)\)

code

P9871

给定 \(m\) 个得分区间,区间全部覆盖才能得分,不能连续覆盖超过 \(k\) 个位置,一共有 \(n\) 个位置,求得分最大值。

\(1 \leq n\leq 10^9\)\(1 \leq m,k \leq 10^5\)

看过好几遍了,就是线段树优化 dp 的板子吧。

考虑 \(f_i\) 表示前 \(i\) 个位置的最大得分,显然有 \(f_i = \max (f_i,f_{i-1})\),然后考虑暴力枚举转移左端点 \(j\),对于 \(j \geq i-k+1\),有转移 \(f_i = \max \left \{ f_{j-2}-(i-j+1)\times d+w_{j,i} \right \}\),对于 \(j \leq i-k+1\),我们在第一个转移中已经进行了。

这样转移是 \(O(n^2k)\),由于 \(n\leq 10^9\),每次能够产生贡献的也只有区间左右端点,所以很自然离散化,复杂度变为 \(O(m^2k)\),用线段树或者树状数组可以很简单地维护 \(w_{j,i}\),具体地,线段树上每一个叶节点 \(j\) 表示从 \(j\) 点开始走到当前节点带来的贡献,显然每一次对 \([1,l_i]\) 区间加法就好了,此时复杂度为 \(O(mk\log m)\),那么我们的转移就是对 \(j\in [i,i-k+1]\) 做转移,这个东西显然可以拆开扔上线段树做区间 \(\max\),更加具体地,我们把与 \(i\) 有关的分离出来,转移变成 \(f_i = -(i+1)\times d + \max \left \{ f_{j-2}+j\times d + w_{j,i}\right \}\),拿线段树维护后面式子就好了,就把刚才计算 \(w_{j,i}\) 的线段树上的 \(i\) 每次再加上 \(f_{i-2} + i \times d\) 即可。

复杂度 \(O(m\log m)\),可以通过。

code

CF2066C

给定一个序列 \(\left \{ a \right \}\),每次需要对 \(P,Q,R\) 三个变量中的一个做 \(\oplus a_i\) 操作,要求任意时刻 \(P,Q,R\) 至少有两个数值相等,求操作方案数。

\(n \leq 2\times 10^5\)

分析性质,令 \(p_i\) 表示 \(a_i\) 的前缀异或和,则任意时刻有 \(P \oplus Q \oplus R =p_i\),根据这个性质,每一个 \(PQR\) 数对都能被表示为 \((p_i,x,x)\) 的样子,设 \(f_{i,x}\) 表示第 \(i\) 个位置相同位置的取值为 \(x\)

考虑转移,数对 \((p_i,x,x)\) 一定会由 \((p_i \oplus a_i,x,x)\)\((p_i,x\oplus a_i,x)\) 转移而来,发现第一个其实就是数对 \((p_{i-1},x,x)\),也就是 \(f_{i-1,x}\),所以有转移 \(f_{i,x} \gets f_{i-1,x}\),对于第二个数对,我们分类讨论,因为上一个数对也要有两个相同数,所以 \(x\) 只能为 \(p_{i-1}\)\(p_i\)\(p_i\) 的方案已经算过了,考虑 \(x=p_{i-1}\) 的方案数,那么上一个数对一定是形似 \((p_{i-1},p_{i-1},p_{i-1})\)\((p_{i-1},p_i,p_{i-1})\) 的,对于第一个,有 \(3\) 种方法,对于第二个,有两种方法,所以有转移 \(f_{i,p_{i-1}} = f_{i-1,p_{i-1}} \times 3 + f_{i-1,p_i} \times 2\)。滚动数组压一下用 map 存就好了。

Submission

[AGC033D] Complexity

好题。

首先有一个显然的做法,设计 \(f_{i,j,x,y}\) 表示左上角是 \((i,j)\) 右下角是 \((x,y)\) 的最小答案,然后可以枚举矩形边长和分割线做到 \(O(n^5)\) 的复杂度,无法通过。

考虑优化以上做法,一个最劣的情况是所有位置周围的数字全部与当前位置不同,那么我们是每两个数字一合并最优,这只会合并 \(\log (nm)\) 轮,所以答案的上界只有 \(\log (nm)\)

发现了这个性质之后,我们就可以优化上述做法了,在一个大矩形枚举的时候,因为可能最优的转移位置只有 \(\log\) 个,所以枚举分割线可以省去,复杂度是 \(O(n^4\log n)\) 的,但是时间优化了空间不够。

再换一个想法,要优化空间就把答案扔到状态上,重新改一下状态,\(f_{k,u,l,r}\) 表示第 \(u\) 行及其往下,\([l,r]\) 这个范围内合并不超过 \(k\) 次所能到达的最大行数是多少。

这个状态就很巧了,对于答案的判定,我们枚举答案,然后看 \(f_{k,1,1,m}\) 是否能扩展到 \(n\) 即可。

\(k=0\) 开始看,我们首先要预处理出这个东西,考虑直接枚举 \(u,l\),然后从 \(l\) 开始枚举 \(r\),因为每次向右走的时候最大扩展位置一定单调不增,所以额外开一个变量每次减就好了,复杂度是 \(O(n^3)\),而且卡不满。

然后是转移,首先有 \(f_{k,u,l,r} \gets f_{k-1,u,l,r}\),然后考虑枚举行来分割的情况,最优的显然是这一部分 \(k-1\) 答案的下一行也拿 \(k-1\) 来扩展,写出来就是 \(f_{k,u,l,r} \gets f_{k-1,f_{k-1,u,l,r}+1,l,r}\)

对于枚举列来分割的情况,我们还是先枚举分割点 \(x\),那么最远扩展位置是 \(f_{k,u,l,r} \gets \min(f_{k-1,u,l,x},f_{k-1,u,x+1,r})\),之后对以上说的转移取 \(\max\) 就做完了。

时间复杂度 \(O(n^4 \log n)\),空间 \(O(n^3\log n)\),可以通过,可能需要卡卡常,我跑的还挺快的。

code

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/898243.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字先锋 | AI+政务,轻松跨语种!霍尔果斯政务服务升级蜕变

今年,义乌国际商贸城的一家袜子店火爆全网,商家通过搭载DeepSeek模型的AI视创工具,只需录制中文口型视频,即可通过系统自动生成阿拉伯语、西班牙语等多语种带货视频,将袜子生意做到了世界各地。 在全球化与数字化深度交织的今天,DeepSeek凭借自然语言处理尖端技术,不仅让…

25年湛江一模第19题(马尔可夫链 )

25年湛江一模第19题(马尔可夫链 )专题:概率+数列 题型:马尔可夫链 难度系数:★★★★题目 (25 年湛江一模第 19 题)甲参加了一场智力问答游戏,每轮游戏均有两类问题(难度系数较低的\(A\)类问题以及难度系数较高的\(B\)类问题)供选择,且每…

25 年湛江一模第8题(函数奇偶性+恒成立)

25 年湛江一模第8题(函数奇偶性+恒成立)专题:概率+数列 题型:马尔可夫链 难度系数:★★★★ 题目 (2025 年湛江一模第8题) 已知定义在\(\mathbf{R}\)上的函数\(f(x)\)为奇函数,且当\(x>0\)时,\(f(x)=e^{x}-a\),若\(\forall x \in \mathbf…

每美搭(1)

一、团队介绍 1.1 团队概况 1.1.1 博客展示链接 团队名:每美搭子们,组长博客链接 https://www.cnblogs.com/0623-k 1.1.2 团队项目描述 每美搭:每美搭是一款专注于服装搭配推荐的APP。它能精准获取用户个人基本体型、上传服装类型等多维度数据,结合地区天气、用户心情、服装…

嵌入向量计算示例

嵌入向量计算示例 1. 问题设定场景:电影推荐系统中用户对电影类型的偏好嵌入 输入特征:4种电影类型(动作片、喜剧片、科幻片、爱情片) 嵌入维度:n_e = 2 词汇大小:n_v = 42. 数据表示 (1)独热编码电影类型 独热编码向量动作片 [1, 0, 0, 0]喜剧片 [0, 1, 0, 0]科幻片 […

塔石串口服务器的工作模式有哪些

串口服务器通过支持多种工作模式,实现了串行接口与网络接口之间的数据透明传输,提供了灵活的网络通信解决方案。以下是串口服务器的几种常见工作模式:| TCP Server模式 在TCP Server模式下,串口服务器作为TCP服务器,等待客户端的连接请求。这种模式下,串口服务器会监听一…

【正点原子】全志T113-i开发板震撼上市!异核开发、工控设计方案!新品上市,限时低价!

【正点原子】全志T113-i开发板震撼上市!异核开发、工控设计方案!新品上市,限时低价!ATK-DLT113IS开发板是正点原子基于全志T113-i处理器而研发的一款用于嵌入式Linux领域的开发板,其拥有高性能、高可靠性、低成本和丰富的接口资源,适用于嵌入式系统开发!T113-i芯片框架 …

Stochastic Orders 理解和相关运算(_随时补充)

Recall数学里,用\(o\)和\(O\)表示the order the terms. \(a_n = o(1)\). \(a_n = O(1)\).Stochastic order notation 是一种用来表示随机变量序列概率收敛的速记方法。 \(O_p(1)\)依概率有界; \(o_p(1)\)依概率收敛到0. \(X_n= O_p(a_n)\Leftrightarrow \frac{X_n}{a_n} =O_p…

DCC控制器模型铁路-蓝牙版本

蓝牙版本: 该单元加上App提供了一个完整的DCC控制器,具有击败更昂贵系统的功能。物有所值,可靠,使用简单,定制系统,以匹配您的火车头花名册。 包括F1到F32功能按钮兼容最新的声音解码器 添加您自己的loco名称和函数标题。 -在Android设备(手机或平板电脑)上安装App 对于初…

jMeter的下载和安装

jMeter简介: JMeter 是一款由 Apache 软件基金会开发的开源性能测试工具,主要用于模拟高负载场景下的应用程序行为,帮助开发者评估系统的性能、稳定性和可靠性。 核心功能1. 协议支持广泛:支持 HTTP/HTTPS、FTP、JDBC、SOAP、REST、WebSocket 等多种协议,可对 Web 应用、A…

测试方法代码以及示例源码都已经上传至代码库,有兴趣的可以看看。

合集 - LeetCode 题集(10)1.LeetCode题集-1- 两数之和2024-08-312.LeetCode题集-2 - 两数相加2024-09-053.LeetCode题集-3 - 无重复字符的最长子串2024-09-094.4 - 寻找两个有序数组的中位数,图文并茂,六种解法,万字讲解2024-09-165.LeetCode题集-5 - 最长回文子串(一)202…

主从搭建innobackupex恢复从库报错Unable to open undo tablespace undologundo001

近日,用innobackupex重新搭建从库时报Unable to open undo tablespace undologundo001错误 下面是解决的过程: 启动从库时报错如下2025-01-16T14:43:16.367875+08:00 0 [ERROR] InnoDB: Unable to open undo tablespace undolog/undo001. 2025-01-16T14:43:16.367904+08:00 0…