DP 套 DP

DP 套 DP 学习笔记

大致内容

DP 套 DP 就是将一个简单 DP 的状态压缩起来放到新的 DP 中当做状态进行 DP 的过程。

常用于计算简单 DP 的答案为 \(k\) 的转移方案的数量。

一般都需要 decoderecode 操作,这里和 插头DP/轮廓线DP 有异曲同工之妙!

例题

P4590 [TJOI2018]游园会

按照以前的套路来,设 \(dp(i,j,p)\) 表示现在放完了第 \(i\) 位,有长度为 \(j\) 的公共子序列,前面两位的状态为 \(p\) 的情况数之和。假了呀!万一兑奖串中间取出一段形成公共子序列怎么办捏?

重新考虑这个题,想想假设给我们了兑奖串和奖章串,我们是如何求出 LCS 的:

\(dp_{i,j}\) 表示奖章串匹配到第 \(i\) 维,兑奖串匹配到第 \(j\) 位的最大 LCS 长度。

\[dp_{i,j}=\begin{cases}\max(dp_{i-1,j},dp_{i,j-1})&(a_i\not=b_j)\\dp_{i-1,j-1}+1&(a_i=b_j)\end{cases} \]

看看最开始我们的状态为什么不能够顺利转移:我们实际上是不知道匹配到了兑奖串的第几位。

那么为了最大化地保留信息,我们设 \(f_{i,state,s}\) 表示当前填到了 \(i\)\(dp_{i,[0,k]}\) 一维数组数组状态为 \(state\),已经和 \(\texttt{NOI}\) 匹配了 \(s\) 位的方案数。

然而 \(state\) 是一串数怎么压缩呢?(核心在此!DP 套 DP 的压缩技巧非常关键)

我们发现对于同一个 \(i\) 满足:\(dp_{i,j-1}\le dp_{i,j}\le dp_{i,j-1}+1\),也就是说每两项之间最多相差 \(1\)

利用这个性质可以将上面 \(dp_i\) 一位数组差分后用二进制压缩起来。

转移?我们对于一个 \(state\) 可以先还原出 \(dp_{i-1}\),根据这一次选择的字符推出 \(dp_i\),之后同样压缩为新的 \(state'\),具体实现时需要预处理出每个 \(state\) 加入新字符后推出的新的 \(state'\)

最终的时间复杂度为 \(\mathcal{O(n2^k)}\),加上大小约为 \(9\) 的常数。

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

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

相关文章

acwing提高组 第一章 动态规划

文章目录数字三角形模型最长上升子序列模型背包模型状态机模型状态压缩DP区间DP树形DP数位DP单调队列优化DP斜率优化DPoj链接数字三角形模型 AcWing 1015. 摘花生1357人打卡 AcWing 1018. 最低通行费1279人打卡 AcWing 1027. 方格取数1158人打卡 AcWing 275. 传纸条933人打卡 …

YBTOJ洛谷P2042:维护数列(平衡树)

文章目录题目描述解析删除区间插入数列修改&翻转区间和&最大子段和代码传送门题目描述 解析 阴间题… 这不是裸的板子吗? 国赛真的有人能把这题写出来吗… 应该算一道练习作用很强的题了 写完这题,各种平衡树维护区间操作的方法可以说是毕业了吧…

CAP 2.4版本发布,支持版本隔离特性

前言自从上次 CAP 2.3 版本发布 以来,已经过去了几个月的时间,这几个月比较忙,所以也没有怎么写博客,趁着2019年到来之际(现在应该是2019年开始的时候),CAP也发布了2018年的最后一个大版本 2.4&…

AT2005-[AGC003E]Sequential operations on Sequence【差分,思维】

正题 题目链接:https://www.luogu.com.cn/problem/AT2005 题目大意 开始有一个1∼n1\sim n1∼n依次排列的序列,然后QQQ次,第iii次把序列长度变为aia_iai​,不足的从前往后循环填充。 求最后每个数字的出现次数。 1≤n,q≤105,1≤ai≤10181…

多项式工业基础与全家桶

多项式工业基础与全家桶 开坑待填,放个常数巨大的板子先 别忘了这道题!P3338 [ZJOI2014]力 #define Maxn 200005 #define mod 998244353 inline int ksm(int x,int ymod-2) {int ret1;for(;y;y>>1,x1ll*x*x%mod) if(y&1) ret1ll*ret*x%mod;ret…

【周末狂欢赛7】【NOIP模拟赛】七夕祭,齿轮(dfs),天才黑客

文章目录T1题目题解codeT2题目题解codeT3题目题解codeT1 题目 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子。于是TYVJ今年举办了一次线下七夕祭。Vani同学今年成功邀请到了cl同学陪他来共度七夕,于是他们决定去TYVJ七夕祭游玩。 TYVJ七夕祭和11区的夏祭的…

股票买卖 IV

股票买卖 IV 题意: 给定一个长度为 N 的数组,数组中的第 i 个数字表示一个给定股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润,你最多可以完成 k 笔交易。 注意:你不能同时参与多笔交易(你必须在再…

9.25 模拟

文章目录前言考场总结前言 260pts 100601000 线段树数组要乘4!!! 结果想了一个多小时和暴力没差了。。。 呜呜呜 但总体还可以啦 T3玄学暴力竟然过掉了 告诉我们卡时的重要性 考场 先看题 T1原题啊啊啊! 真就签到题了 感觉T2好…

Silence 主题配置代码

页面定制 import url(https://fastly.jsdelivr.net/gh/esofar/cnblogs-theme-silence3.0.0-beta3/dist/silence.min.css);media only screen and (max-width:1365px){.github-corner{display:none}}media only screen and (max-width:1259px){#home{width:100%!important}}medi…

AT3857-[AGC020C]Median Sum【背包,bitset】

正题 题目链接:https://www.luogu.com.cn/problem/AT3857 题目大意 给出nnn个数字的一个序列aaa,求它的所有非空子集的和的中位数。 1≤n,ai≤20001\leq n,a_i\leq 20001≤n,ai​≤2000 解题思路 考虑到假设所有数的和为SSS,一个集合的和为xxx&#x…

.NET Core 如何为项目提供高性能解决方案?

本系列,我们将探讨.NET Core 的一些好处,以及它如何为市场提供高性能解决方案,为传统.NET 开发人员和技术人员提供帮助。正文前言随着.NET Core 2.0 在 2016 年首次发布,微软拥有了这个通用、模块化、跨平台开源项目的下一个主要版…

1058. 股票买卖 V

1058. 股票买卖 V 题意: 给定一个长度为 N 的数组,数组中的第 i 个数字表示一个给定股票在第 i 天的价格。 设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): …

[2.9训练]【CF909C】Python Indentation,【CF909D】Colorful Points,【CF909E】Coprocessor

文章目录T1:Python Indentation题目题解codeT2:Colorful Points题目题解codeT3:Coprocessor题目题解codeT1:Python Indentation 题目 题目描述 In Python, code blocks don’t have explicit begin/end or curly braces to mark…

模板:2-SAT问题

文章目录前言实现代码所谓2-SAT,就是解决两个SAT的问题 (逃) 前言 SAT 是适定性(Satisfiability)问题的简称。一般形式为 k - 适定性问题,简称 k-SAT。而当 k>2 时该问题为 NP 完全的。所以我们只研究 …

CF1481F-AB Tree【构造,背包】

正题 https://www.luogu.com.cn/problem/CF1481F 题目大意 给出nnn个点的一棵树,在每个节点上填a/ba/ba/b,要求恰好有mmm个aaa。要求每个节点到根路径上的字符串种类最少,输出方案。 1≤m≤n≤1051\leq m\leq n\leq 10^51≤m≤n≤105 解题思…

Docker最全教程之使用Tencent Hub来完成CI(十)

本周更新两篇,保证不太监!在本系列教程中,笔者希望将必要的知识点围绕理论、流程(工作流程)、方法、实践来进行讲解,而不是单纯的为讲解知识点而进行讲解。也就是说,笔者希望能够让大家将理论、…

P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治+欧几里得距离)

P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治欧几里得距离) 记得上一次欧几里得距离的转化是CF1093G Multidimensional Queries,我们使用了点对在四种方向分别考虑并用 \(\max\) 合并的方法解决,现在使用一种类似的方法。 \(\bigstar\texttt{Trick}\)&…

[2.7]【CF933A】A Twisty Movement【CF926B】Add Points【CF917A】The Monster【CF919E】Congruence Equation

文章目录T1:A Twisty Movement题目题解codeT2:Add Points题目题解codeT3:The Monster题目题解codeT4:Congruence Equation题目题解codeT1:A Twisty Movement 题目 题目 题解 因为aia_iai​1/21/21/2,于…

LIS最长上升子序列

LIS算是比较经典的问题&#xff0c;常用的是O(n^2)的方法 for(int i1;i<n;i){dp[i]1;for(int j1;j<i;j){if(a[j]<a[i])dp[i]max(dp[i],dp[j]1);}mxmax(mx,dp[i]);}我们这里优化成O(nlogn) 我们模拟一个栈stack&#xff0c;每读入一个数&#xff0c;如果这个数大于栈顶…

AT5160-[AGC037C]Numbers on a Circle【贪心,堆】

正题 题目链接:https://www.luogu.com.cn/problem/AT5160 题目大意 给出两个长度为nnn的环序列aaa和bbb&#xff0c;每次你可以让aaa中的一个数变为它和相邻两个的和。 求最少的步数将aaa变为bbb。 1≤n≤105,1≤ai,bi≤1091\leq n\leq 10^5,1\leq a_i,b_i\leq 10^91≤n≤10…