DP-笔记1

有些东西要记下来,不然就丢了。


动态规划,是利用问题可以被划分为多个解法类似的子问题的性质,使用若干关键的、与解集有关的参数,称作“状态”,来描述每一个子问题。子问题是逐层推进、有依赖的,解决上一个子问题后留下的答案,是解决这个子问题需要的参数,这种层序,就是“阶段”。只有完成一个阶段的计算后,才能借助这个阶段的信息计算下一个阶段。最终达到解决整个大问题的目的。

从描述中,我们可以发现,动态规划所要解决的问题需要满足某些性质。

首先,这个问题要容易分成若干个解法类似的子问题,并且,这些子问题中有一些层次关系,低层次的问题可以导出高层次问题,这就被称为“最优子结构性质”

其次,只能是低层次的答案对高层次答案有贡献,否则就不具有一个明确的层次了,这就是“无后效性”。

现在再来考虑DP是如何优化暴力的。

以LIS问题为例。

考虑暴力地求解,那么我们可以枚举每一个位置,并且继续枚举它之后的每一个位置。

考虑DP是如何求解的,DP在进行的时候,直接从前面选择一个可以接上的长度接上。为什么呢?其实容易发现,这个问题在递归暴力处理时体现了很强的“无后效性”和“层序性”,而且对于每一个问题,考虑添加一个数之后的最优方案,就是如此解决。

再如LCIS。

考虑暴力解决问题,那么是不是要先枚举A中每一个上升子序列,再判断B中有没有?

再枚举时,我们发现,从x位置开始的上升子序列就是从x+1位置的上升子序列接上x

同样,在B中枚举也一样。

于是,我们可以直接排除不会产生答案的部分枚举了,直接由x+1推x的答案。

则我们发现,其实在以上枚举中,也出现了“阶段”的描述:我们要先枚举每一个A中的x,再在B中寻找子序列。

倒转一下定义,将以上枚举表示为f,f[x][y]指的是在以x结尾的A和以y结尾的B中的答案。

方程类似LCS,过。

其实上,这种关系如何从暴力推到的想说清很困难,但我本来就不打算给别人看。


先去增维,再看冗余


区间dp,如果想不出如何区间拼接,不妨想想如果从左边右边端点加一个会怎么样

P4170 [CQOI2007]涂色

所以说,对于一个这样那样的最优化问题,考虑为什么会产生极值,进行拟合,可能是一个好方法


posted @ 2023-02-28 16:16  haozexu  阅读(21)  评论(0)    收藏  举报