DP of DP(Original Hardcore)
DP of DP(Original Hardcore)
一篇硬核的思考。当我沉心写下,愈发觉得那份相似感是如此浓烈。LB,恰如 DPofDP,神样的创造。
Sayings
-
dp套dp一般解决的是一个形如“满足某种条件的情况有多少个”的计数问题,和一般dp不同的是,判断一个情况是否满足条件十分困难,需要dp解决。——william555
-
在 dp套dp 里面,我们就将内层 dp 的结果作为外层 dp 的状态进行 dp。——dead_X
-
其实,dp 套 dp 也属于在自动机上的 DP,从自动机的角度理解 dp 套 dp 也是有益的。——E_huan
-
其实我不是很认同这个名字。在我看来,更应该叫做“建 DAG 优化 DP”。——未欣
-
大致一个经典的形式是“求……值为……的方案数”,特点是对于一个给定的情况,我们需要 DP 求出其对应的值,而题目要求对于所有情况求出对应方案数。
换言之内层是求出值是多少或者判断是否合法的判定 DP,而外层是求方案数的计数 DP。
外层 DP 是在根据内层 DP 值建出的 DFA 上进行的。——SoyTony
-
DP套DP指的是使用两层DP,以内层结果表示外层状态的一种算法(大多地方的解释),但是我个人认为它更像是一种基于自动机的DP。——xuyuansu
-
其基本思想在于将dp的过程视作自动机,将dp的状态视作节点,并在此之上跑自动机dp,从而解决复杂的问题。——cainiaoshanglu
-
dp 的本质:通过不同的转移更新状态的答案,就像 DAG 上的拓扑一样。
dp 套 dp 的本质:将内层 dp 的答案作为外层 dp 的状态进行转移。——ctldragon
Minds
注:将 DPofDP、外层DP、内层DP 单独作为专有名词,它们中间不打空格。
This is the core of dynamic programming, namely:
Definition of states and transitions between states (definition of equations of state).
状态和转移,是 DP 的基石。
dynamic programming is a method for solving a complex problem by breaking it down into a collection of simpler subproblems. —— wiki
wiki 对 DP 的解释和我对 DPofDP 的浅度理解有一个共同的词:break down
。
但两者并不尽相同。
DP 的 break down
,是开创性的问题简化。对于最原始的搜索、模拟问题,给予一个更加高效的算法,对原问题进行简化。
而我对 DPofDP 理解的 break down
,是内层 DP 的融化,它寄身于 外层DP 的状态之中,而游离于 外层DP 的转移之上。
前者是目的性的,思考着 “为什么要 DP”,揭示 DP 的伟大本质;
后者是表观现象,是经过简单观察后常人能得出的结论。
尽管如此,后者仍然耗费了不少时间,但这又是极其必要的,作为迈向本质的桥梁。
所以接下来的问题就十分明确了:为什么要 “DPofDP”?
以我目前对此类题型的观察,DPofDP 始终绕不去的一个观点是:将 内层DP 作为 外层DP 的状态。
这也是一个令人震撼的思想!毫不夸张地说,这是 DPofDP 的核心,是人们为了用 DP 解决问题而主观引入的特别的状态。
内层DP 被拆解成了两个部分——它的状态与转移。
内层DP 的状态(伴随着状态的结果),无疑成为了外层状态的一部分。
内层DP 的转移,就是一件有趣的事情:它既可以被溶解为 外层DP 的状态,也可以并行于 外层DP 的转移。形象地说,前者是 虚转移,后者是 实转移。
当 内层DP 的转移成为 外层DP 的状态时,从现象上看,它就是一个普通的一层 DP——如有些人所说,是在 内层DP 建出的 DFA 上转移,像 DAG 上的拓扑转移那样。
当 内层DP 的转移并行于 外层DP 的转移时,这个转移就是在问题的算法实现流程中以自己的面貌出现的,你仍然可以清楚地分辨出 内层DP 的形态。
人们发明出 DP,将原本困难的问题简化。可人们发现了新的问题——依靠单纯的 DP 也无法解决的问题。
这时,外层DP 依靠 内层DP 完成了问题的解决,内层DP 也实现了它的意义——break down
,对问题的简化。
DPofDP 的本质就是 DP 的本质,并且将其放大。
内层DP 为了那份意义而拆解自己,那是一个多么伟大的壮举啊!
就像一个凄美的故事,被埋藏在某个角落的迷宫之中...