cmhgd

抽象式打表 (动态规划) 瞎jb总结 --- 持续更新

属于非主流总结 俗称想到啥说啥 不管对不对式

关于背包

在背包问题中
总有一层 K 表示的是背包的容量

仔细观察得:

背包问题中 把某一循环放在 K层之外的是可以相互选择(互相可以选择)
如果放入了 K层内部 属于相互影响选择(俗称 只能选择一个)
所以在遇到类似的问题的时候 第一时间看别人代码没有思路 可以先看看 K 层在哪个位置

然后再考虑用的是01背包,还是分组背包

关于LCS

LCS 最长公共子序列
当发现一道题目要求的是 LCS 的时候
可以通过看数据范围来看该怎么做
一般来说求解LCS只有两种方式

  • 通过暴力dp n^2 由于会上网随便都能查到就不说了
  • 通过将角标进行标记 然后转换成LIS类的问题 nlogn 解决

具体说一下第二种

其实理解第二种有一种非常非常非常easy的方式
最长公共子序列
无非就是两个序列 A, B
因为数字还是字母都无所谓, 所以我都先视为是数字
不妨设A串等于 1, 2, 3, 4, 5, 6, 7, 8....
那么对于任意的B串, A串与B串的最长公共子序列就是B串的最长上升子序列!(这点很好理解吧!)
但是1, 2, 3, 4, 5, 6, 7, 只是一些符号罢了
所以易得 对于任意一个子串 A 都可以 看成是 1, 2, 3, 4, 5, 6, 7, 8的形式(也就相当于我重新定义了1, 2, 3, 4..的含义)
那么当A串确定后 B串可以通过我的定义方式也转换成纯数字的形式 (如果出现了 A中没有的字符 可以设为 -INF 来保证不是上升子序列的部分)

posted on 2020-12-06 20:40  cmhgd  阅读(69)  评论(0编辑  收藏  举报