动态规划
数字三角形篇
本章标题虽为数字三角形,不过,主要内容 并非 单纯对 数字三角形 和 代码 的讲解
而是将此题的思想进行 扩展、应用。
思路扩充
由 数字三角形 可知,动态规划的 状态转移 可以由多个不同的路径进行更新。
由于 $Dp$ 的思想是 记忆化传递 每个点之前路径段的信息,故此,这多个终点相同的路径在更新节点的作用上是相同的
所以,通过多个 $max / min$ 操作取这些不同路径的 最大值/最小值 就可以解决这个问题了
不过,同时还要注意分别 最大值 和 最小值 的不同,即 求大设小,求小设大, 其中的设是初始化的意思。
自行解决以下习题即可
双向数字三角形
这一类题目,首要的是将 双向 改为 同向两次
用 $(x1, y1), (x2, y2)$ 分别表示两次的动归方程
但是,需要注意的是,每个节点的值只有在第一次才会被取走
所以,我们将两个方程式揉合成一个大的方程式 $(x1, y1, x2, y2)$ 就可以在其中一次取走元素后避免再取一次,
只需要在每次更新 f数组的值时,将另一边的值加在一起同时更新进去即可。
然后,我们就有一个 $O(n^4)$ 的代码了
我们知道每次取数时只能往右边或下边走
所以我们可以通过枚举可能的横纵坐标之和 $k$,边界判断后,$k$ $-$ 横坐标就等于纵坐标
此时,时间复杂度已被优化为 $O(n^3)$ 了, 如果想进一步优化可以选择 背包 或 费用流 进行