上接 闫氏分析法,在实际运用中这个方法发挥效果不佳,因为除了帮初学者理解DP以外,并没有降低解决DP题的难度。
所以我提出了以下具体解决方法。
前言:
DP问题=可以爆搜+可去后效性+子问题重叠性+最优子结构性
因为所存状态不同,可能设计出满足/不满足这几个条件的算法。
如何设计
最实用的技巧是,将所有会被决策涉及的状态包含。
然而有一个思维上的问题,我们没有定义状态,没有考虑后效性,但我们却需要从由状态出发的决策来推导状态。
所以形式化的我们将整个集合设成未知数$f(,…,)$
但是有一点确实很清晰的,就是边界的状态值。例如:$f(空)=0$
我们知道DP是由已知推位置,所以考虑一下从边界往外推能推几个状态。
而由初始状态开始的第一步推到是简单的。
但又有一个问题:如果决策数太多怎么办?
采用计划图表示法。
我设计的计划图是:
用大括号,对于每一维内部有转移再开多个大括号。
然而,初始状态过多或者初始状态有没涉及到的转移状态 这些问题改怎么解决呢?
形式化的,由初始状态知道的状态加入参数里。
然后通过设多个未知数用来套取转移,没用到的未知数可以之后简化。
熟知参数
参数可以包含排名,数值。
参数可以包含多种局面情况。
例子 Phone Numbers P
形式记录f(a,b,c,d,e,…)
f(空)=1
考虑扩展:
按一个,按两个和按四个
在可以满足时有,
按一个就是1
按两个就是2
按四个就是24
然后套路的对于无相关的按法,结果是乘。
但是事实上会相关,有后效性。
不过能发现知道数字就能判断,所以定义 f(i是a,i-1是b,i-2是c,以及前面能否匹配)
考虑简化无用状态,简单的,发现匹配其实有很多非法状态,可以剪一下枝。
所以将所有合法状态跑出来,用hash表储存转移即可。