1.【扯谈概念】

\(dp\) 套 \(dp\) 其实也就是 \(dp\) 。

这里就定义下面两个概念:

内层 \(dp\) 表示的是被套在里面的那个 \(dp\)

外层 \(dp\) 表示的是最外面的那个 \(dp\)

这样可能比较抽象。

举个例子,像这种形式的 \(dp\) 转移:

\[f[i][j]=\max(f[i][j],f[i][j-k]+g[i][k])
\]

在这里面 \(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\) 列的最多正确粉刷数量。

考虑去转移这个方程,发现可以写出这样的状态转移:

\[f[i][j][k]=\sum_{l=0}^{k-1} max(f[i][j][k],f[i-1][j][l]+g[j][l][k])
\]

其中的 \(g[j][l][k]\) 表示的是第 \(j\) 行第 \(l\) 列到第 \(k\) 列的最多粉刷正确数。

注意转移的时候从上一行到下一行的处理。

然后这个方程就没问题了。

分析这么的时间复杂度为 \(O(tnm^3)\)

如果将 \(n\) 与 \(m\) 认为同阶,那么复杂度为 \(O(tn^4)\)

显然不可过的样子,得优化一下。

我们考虑 \(dp\) 的复杂度都来源于哪里?

可能是枚举状态也可能是转移的复杂度。

这个转移的复杂度我们发现是无法有效的优化的(至少我不会)。

然后我们考虑缩小它的状态,我们能发现我们等价于是枚举了每个点的 \(dp\) 情况。

我们试着把它弄为每行的 \(dp\) 情况。

那么状态就变为: \(f[i][j]\) 表示的是第 \(i\) 行刷 \(j\) 次的最大正确粉刷数量。

最新文章

  1. 远方的塔--Pylons
  2. Android随
  3. HDFS的运行原理
  4. Python基础-列表_元组_字典_集合
  5. Python学习笔记-字符串
  6. LINQ 简单用法【1】
  7. ios开发逆向传值的几种方法整理
  8. poj 1426 Find The Multiple( bfs )
  9. hadoop namenode多次格式化后,导致datanode启动不了
  10. 关于Adobe Flash 11.3 引起的火狐使用问题
  11. JavaScript中的计时器原理
  12. SD卡添加文件,添加不进去,报 Read-only file system错误
  13. 11.python线程
  14. Android 中的缓存
  15. JS拖拽元素原理及实现代码
  16. Windows:服务已经标记为删除
  17. CATransition 实践
  18. Centos6下Python3的编译安装
  19. 获取图片的metaData
  20. python文本 字符串逐字符反转以及逐单词反转

热门文章

  1. golang快速入门(六)特有程序结构
  2. Go语言协程并发---原子操作
  3. Go语言网络通信---tcp上传大文件(粘包问题还需优雅解决)
  4. 如何保证mq不丢消息
  5. camera中LENS和SENSOR的CRA是如何搭配的?
  6. 激光雷达Lidar Architecture and Lidar Design(下)
  7. JAVA 进行图片中文字识别(准确度高)!!!
  8. 【NX二次开发】属性操作相关函数的使用方法
  9. CMD批处理(5)——自动以管理员身份运行批处理脚本
  10. VLAN协议与三层交换机 (Access/Trubk/Hrbrid)