dp 套 dp扯谈
1.【扯谈概念】
\(dp\) 套 \(dp\) 其实也就是 \(dp\) 。
这里就定义下面两个概念:
内层 \(dp\) 表示的是被套在里面的那个 \(dp\)
外层 \(dp\) 表示的是最外面的那个 \(dp\)
这样可能比较抽象。
举个例子,像这种形式的 \(dp\) 转移:
\]
在这里面 \(g[i][k]\) 是不定的,就是我们开始不知道,是我们求出来的,然后我们利用它去进行后面的转移,把它在后面当成一个恒定的 \(val\) 。我们把求解这个 \(g\) 的过程就叫做内层 \(dp\)。
而我们发现 \(f\) 就是我们要求的真正的一个答案状态,然后是把求解这个 \(g\) 的过程包含着的,我们就把求解 \(f\) 的过程叫做外层 \(dp\) 。
而求解这个问题的过程就叫做 \(dp\) 套 \(dp\) 。
本质上说其实 \(dp\) 套 \(dp\) 在我的理解来看就是首先就是将内层的 \(dp\) 结果,作为外层 \(dp\) 进行转移的方法。
如果通俗说就是先算出每一步可能产生的贡献。
然后依托贡献在来进行一次 \(dp\) 。
2.【例题讲解】
你单独看着这个概念,你可能似懂非懂的。
因为这个东西确实有点抽象,下面配合例题来进行讲解。
The First Problem
题意:
有 \(n\) 块木板,每一块木板长度为 \(m\) ,你可以粉刷 \(t\) 次,每次只能粉刷一块木板上连续的一部分为同一颜色(红色或蓝色),给你一个期望粉刷出的木板的颜色,问你最多能粉刷出多少个与期待相同颜色的格子。
题解:
当拿到这个题目的时候,根据传统,它求什么我们就设什么。
我们可以设状态为 \(f[i][j][k]\) 表示刷 \(i\) 次,刷到第 \(j\) 行,第 \(k\) 列的最多正确粉刷数量。
考虑去转移这个方程,发现可以写出这样的状态转移:
\]
其中的 \(g[j][l][k]\) 表示的是第 \(j\) 行第 \(l\) 列到第 \(k\) 列的最多粉刷正确数。
注意转移的时候从上一行到下一行的处理。
然后这个方程就没问题了。
分析这么的时间复杂度为 \(O(tnm^3)\)
如果将 \(n\) 与 \(m\) 认为同阶,那么复杂度为 \(O(tn^4)\)
显然不可过的样子,得优化一下。
我们考虑 \(dp\) 的复杂度都来源于哪里?
可能是枚举状态也可能是转移的复杂度。
这个转移的复杂度我们发现是无法有效的优化的(至少我不会)。
然后我们考虑缩小它的状态,我们能发现我们等价于是枚举了每个点的 \(dp\) 情况。
我们试着把它弄为每行的 \(dp\) 情况。
那么状态就变为: \(f[i][j]\) 表示的是第 \(i\) 行刷 \(j\) 次的最大正确粉刷数量。
dp 套 dp扯谈的更多相关文章
- bzoj 3864: Hero meet devil [dp套dp]
		3864: Hero meet devil 题意: 给你一个只由AGCT组成的字符串S (|S| ≤ 15),对于每个0 ≤ .. ≤ |S|,问 有多少个只由AGCT组成的长度为m(1 ≤ m ≤ ... 
- [模板] dp套dp && bzoj5336: [TJOI2018]party
		Description Problem 5336. -- [TJOI2018]party Solution 神奇的dp套dp... 考虑lcs的转移方程: \[ lcs[i][j]=\begin{ca ... 
- luogu 4158 粉刷匠 dp套dp
		dp套dp 每个木板是个递推的dp,外部是个分组背包 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i&l ... 
- DP套DP
		DP套DP,就是将内层DP的结果作为外层DP的状态进行DP的方法. [BZOJ3864]Hero meet devil 对做LCS的DP数组差分后状压,预处理出转移数组,然后直接转移即可. tr[S] ... 
- Codeforces 372B Counting Rectangles is Fun:dp套dp
		题目链接:http://codeforces.com/problemset/problem/372/B 题意: 给你一个n*m的01矩阵(1 <= n,m <= 40). 然后有t组询问( ... 
- 【BZOJ3864】Hero meet devil DP套DP
		[BZOJ3864]Hero meet devil Description There is an old country and the king fell in love with a devil ... 
- codeforces 979E(dp套dp)
		题意: 有n个点,编号为1~n.有的点颜色是黑色,有的点颜色是白色,有的点的颜色待涂.你还可以连一些边,但这些边一定是从小编号连到大编号的点. 对于一个确定的图,我们去统计有多少条路径满足“该路径经过 ... 
- P4590-[TJOI2018]游园会【dp套dp】
		正题 题目链接:https://www.luogu.com.cn/problem/P4590 题目大意 给出一个长度为\(m\)的字符串\(s\). 对于每个\(k\in[0,m]\)求有多少个长度为 ... 
- 洛谷 P5279 - [ZJOI2019]麻将(dp 套 dp)
		洛谷题面传送门 一道 dp 套 dp 的 immortal tea 首先考虑如何判断一套牌是否已经胡牌了,考虑 \(dp\).我们考虑将所有牌按权值大小从大到小排成一列,那我们设 \(dp_ ... 
随机推荐
- [leetcode]  208. 实现 Trie (前缀树)(Java)
			208. 实现 Trie (前缀树) 实现Trie树,网上教程一大堆,没啥可说的 public class Trie { private class Node { private int dumpli ... 
- (重磅)Internal: Failed to call ThenRnnForward with model config问题的解决(Keras 2.4.3和Tensorflow2.0系列)
			与此问题斗争了整整十天.win10,keras2.4.3,CUDA 10.1,CUDNN 7.6, tensorflow 2.3.0,驱动程序nvida 452 该问题出现在BiLSTM(GPU加速) ... 
- js的节流、防抖以及使用场景
			介绍 首先看一个没有经过任何处理的: 1 // 模拟一个输出的函数 2 function input(value) { 3 console.log(`输入的内容${value}`) 4 } 5 con ... 
- 用NVIDIA Tensor Cores和TensorFlow 2加速医学图像分割
			用NVIDIA Tensor Cores和TensorFlow 2加速医学图像分割 Accelerating Medical Image Segmentation with NVIDIA Tensor ... 
- Usb-type-C端口实现的挑战与设计方案
			Usb-type-C端口实现的挑战与设计方案 USB Type-C port implementation challenges and design solutions USB from 1.1 t ... 
- 【NX二次开发】Block UI  指定坐标系
			属性说明 属性 类型 描述 常规 BlockID String 控件ID Enable Logical 是否可操作 Group ... 
- 面试官:一个TCP连接可以发多少个HTTP请求?
			曾经有这么一道面试题:从 URL 在浏览器被被输入到页面展现的过程中发生了什么? 相信大多数准备过的同学都能回答出来,但是如果继续问:收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式.什 ... 
- 《Docker基础与实战,看这一篇就够了》
			什么是Docker? Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术 ... 
- 一次 RocketMQ 顺序消费延迟的问题定位
			一次 RocketMQ 顺序消费延迟的问题定位 问题背景与现象 昨晚收到了应用报警,发现线上某个业务消费消息延迟了 54s 多(从消息发送到MQ 到被消费的间隔): 2021-06-30T23:12: ... 
- zabbix_manage的使用
			实验环境: zabbix server 172.16.1.121 访问端 172.16.1.122 55.1 说明 zabbix_manager是zabbix终端管理工具,可以在linux终端实现管理 ... 
