动态规划之线性DP


dp给我的感觉就相当于dfs。只不过dp是从一个集合推到另一个集合。在思考dp的时候可以思考一下如果dfs的话,它是如何推出答案的。也就是说,我们不用关心具体的dfs过程,但要知道它是如何从无到有,算法推进过程中得到中间结果的顺序是什么。把这些中间结果放到一个集合中,就是dp。


最长上升子序列模型

最长上升子序列模型

数字三角形模型

数字三角形模型

有些题目,要求你求出一个最佳序列。这个序列的元素不一定是数。

分级

先要知道一个定理:B序列的所有元素肯定都在A序列中出现过。

在得到答案的算法推进过程中,我们要暴力枚举出所有的B序列。在暴力枚举所有B序列的过程中,也会枚举出一些中间序列(类似于dfs中的状态节
点)。将这些序列按某一特征进行划分。

集合:{i, j}:与A[1……i]配对,且以A1[j]结尾的B序列。(A1[j]是排序好的A序列)

属性:dp[i][j] : MIN S

集合划分:遮掉A[j],所有的序列都可以唯一映射到{i - 1, k}中{1 <= k <= j}。

所以dp[i][j] = min(dp[i - 1][k] + abs(A[i] - A1[j]);

移动服务

题目让求最小花费,实际上就是让你去求出一个最佳序列,这个序列的每个元素是服务员移动。按照这个序列,能够得到最小花费。

要求最小化的花费,就要知道具体的安排方案;因此问题等价于求最小花费的安排方案。得到安排方案是一个从无到有的过程,我们把过程中的一些
中间方案放到一个集合中,用集合来推动算法的过程,就能大大降低时间复杂度。

f[i][x][y]
集合:完成了前i个请求且三个服务员在p[i], x, y的所有安排方案集合。

属性:MIN花费

状态划分太复杂,我们可以看看{i, x, y}可以到哪些集合:
{i, x, y} —>
1.如果派x到p[i + 1]:{i + 1, p[i], y}
2.如果派y到p[i + 1]:{i + 1, x, p[i]}
3.如果派p[i]到p[i + 1]:{i + 1, x, y}

线性DP题有的没有很好的规律与模板,需要自己设计

杨老师的照相序列

I-区域

有个题属于背包问题。还没有接触背包。

饼干

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值