DP 套 DP(DP of DP)

news/2024/10/4 22:18:05

把 DP 过程当作状态进行 DP。DP of DP 一般数据范围不会太大,而且一般是计数题。

DP of DP 的本质是自动机上 DP。 大致上可以写作 \(dp[\dots][S]\) 表示外层 DP 进行到 \(\dots\) 阶段,内层 DP 对应到 \(S\) 阶段。

例一:基因

题意:给出串 \(s\) 和一个数 \(m\)\(n=|s|\)。求对于 \(i=0\sim n\),有多少串 \(t\) 满足 \(|t|=m\)\(LCS(s,t)=i\)\(n\le 15,m\le 10^3\)

假设我们已经知道这是一道 DP 套 DP 的题目。那么对于 DP套DP,最重要的想法就是考虑内层 DP 是怎么进行的

在这题,内层 DP 是 "最长公共子序列"。平时做 LCS,一般是 \(f[i][j]=\max(f[i-1][j],f[i][j-1],f[i-1][j-1]+[s_i=t_j])\)

考虑完内层 DP,然后就要考虑怎么把内层 DP 的状态压缩入外层 DP 的状态。

因为 \(t\) 是变化的,所以 DP 时拿一维记录目前考虑到 \(t\) 的第 \(i\) 位了;对应的,考虑拿一维 \(S\) 记录此时 \(f[1\sim n][i]\) 的值。
DP of DP 中,一般数据量较小的那一边作为被压缩的内层 DP。 比如这题,\(n\le 15\),用 \(S\) 记录就只用压缩长度 \(15\) 的数组了。

但是我们面临第二个问题:怎么用 \(S\) 记录此时 \(f[1\sim n][i]\) 的值?总不可能开十五维数组。这个点也是大部分 DP of DP 的难点,怎么压缩内层 DP 的状态?这里需要一些神秘的观察。

观察:当 \(j\) 固定,\(f[x+1][j]-f[x][j]\in \{0,1\}\)

证明:

\(j\) 的大小数学归纳法。\(j=1\) 显然。

\(f[x+1][j]=f[x][j]\),立即成立。

\(f[x+1][j]=f[x][j-1]+1\),又 \(f[x][j]\ge f[x][j-1]\),所以 \(f[x+1][j]-f[x][j]=f[x][j-1]+1-f[x][j]\le f[x][j-1]+1-f[x][j-1]=1\)

\(f[x+1][j]=f[x+1][j-1]\)\(f[x][j]\ge f[x][j-1]\),由数学归纳法,\(f[x+1][j-1]-f[x][j-1]\le 1\),所以 \(f[x+1][j]-f[x][j]\le f[x+1][j-1]-f[x][j-1]\le 1\)

证毕。

有了这个性质又怎么样?得出结论:\(\Delta f\) 是一个 \(01\) 序列,所以可以用一个二进制数 \(S\) 压缩这个差分数组。

因此可以定义出 \(dp[i][S]\):填 \(t\) 的前 \(i\) 位,\(\Delta f[1\sim n][i]\)\(S\) 的方案数。最终 \(i\) 的答案就是 \(\sum dp[m][A]\),其中 \(A\) 是一个包含 \(i\)\(1\) 的二进制数。

例二:BZOJ3591:最长上升子序列

题意:给出 \(1\sim n\) 的一个排列的某一个最长上升子序列(记其长度为 \(m\)),求原排列可能的种类数。\(n\le 15\)

在这道题目里,内层 DP 就是 "最长上升子序列"。

经过瞪眼法,我们发现 \(f[i]\) 表示前 \(i\) 个数的 LIS 长度没有好的性质。难道要放弃了吗?

转念想到 LIS 的另一种求法:维护 \(f_i\) 表示长度 \(i\) 的 LIS 结尾数最小值。而这个数组就有比较好的性质了:它是单调递增的,而且每新加一个数进来,只会修改一个位置。每个数有三种状态:在 \(f\) 中,曾经在 \(f\) 中,还没考虑。用三进制压缩为 \(S\)

\(dp[i][S]\) 表示填了前 \(i\) 位,此时 \(f\) 的状态为 \(S\) 的方案数。在转移时强制只能转移到合法的 \(S'\)。具体而言,假设这一步选择填 \(j\),必须满足:① 若 \(j\) 在给定的 LIS 内,要求 LIS 中 \(j\) 之前所有的数都填了;② 要求填了 \(j\) 后前 \(i+1\) 个数的 LIS 长度 \(\le m\)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

.net core 安装服务

https://www.jianshu.com/p/e1b3b61f876a使用NSSM 后面的代码演示以Asp.net Core 2.1作为演示,其他.Net Core方式一致。 1、确保.Net Core程序可以正常运行 先把Asp.net Core发布,然后直接运行dotnet命令,确保程序可以运行并访问 2、使用NSSM安装dotnet 下载NSSM,使用命…

vs2015安装包丢失或损坏解决工具 或者不能启动

打开“本地组策略编辑器”(gpedit.msc)。展开“计算机配置”>“管理模板”>“系统”>“Internet 通信管理”,然后选择“Internet 通信设置”。选择“关闭自动根证书更新”>,“禁用”,然后选择“确定”或“应用”。  下载最新的组件版本(备份的) https://lea…

uboot 启动自编写程序的方式

uboot 启动自编写程序的方式 uboot 存在 boot 命令。 自己最初在尝试撰写串口程序时,选择了使用汇编来完成。 在这段时间,自己使用 go 命令来尝试载入程序 先是在 Ubuntu 上搭建 tftp 目录 # /etc/default/tftpd-hpaTFTP_USERNAME="tftp" TFTP_DIRECTORY="/ho…

20240924

[牛半仙的妹子 Tree(tree)](http://ac.robo-maker.cn/d/contest/p/ZY1044?tid=66f28cd11bca2159e88c8fb0) 我们会发现其实牛半仙发癫时就等于将以前的标记清空,从头开始,所以我们可以考虑根号分治,如果两个牛半仙发癫的时间间隔小于 \(\sqrt n\) ,那么我们可以直接暴力枚举两…

『模拟赛』冲刺CSP联训模拟2

『模拟赛记录』冲刺CSP联训模拟2Rank 不重要了A. 挤压 你说的对,期望怎么能算签呢? 一个重要的性质:一个数的平方可以在二进制下表示为 \(\sum_{i,j}\ s_i\ s_j\ 2^{i+j}\),所以就可以分别求每一位对答案的贡献了。 设 \(f_{i,1/0,1/0}\) 表示到第 \(i\) 个数我们枚举的两位…

PbootCms上传图片变模糊、上传图片尺寸受限的解决方案

在使用PbootCMS的过程中,如果上传的图片被压缩变得模糊,通常是因为上传的图片尺寸过大。PbootCMS 默认的上传图片限制宽度为 1920 像素,缩略图的限制大小为 10001000 像素。可以通过调整这些参数来解决这个问题。 解决方案打开 config.php 文件 调整 max_width 和 max_heigh…

ROS基础入门——实操教程

ROS新人可看ROS基础入门——实操教程前言 本教程实操为主,少说书。可供参考的文档中详细的记录了ROS的实操和理论,只是过于详细繁杂了,看得脑壳疼,于是做了这个笔记。Ruby Rose,放在这里相当合理前言:本文初编辑于2024年10月24日 CSDN主页:https://blog.csdn.net/rvdgds…

PbootCMS增加可允许上传文件类型,例如webp、mov等文件格式扩展

在PbootCMS中增加可允许上传的文件类型(例如 webp、mov 等文件格式),需要在多个地方进行配置。以下是详细的步骤: 操作步骤 1. 修改 config.php 文件 首先需要修改 config.php 文件,增加允许上传的文件类型。打开 config.php 文件打开 config.php 文件,通常位于 /config …