递归和动态规划
暴力递归:
1, 把问题转化为规模缩小了的同类问题的子问题
2, 有明确的不需要继续进行递归的条件(base case)
3, 有当得到了子问题的结果之后的决策过程 4, 不记录每一个
子问题的解
动态规划
1, 从暴力递归中来
2, 将每一个子问题的解记录下来, 避免重复计算
3, 把暴力递归的过程, 抽象成了状态表达
4, 并且存在化简状态表达, 使其更加简洁的可能
递归可以改成动态规划的情况
递归中有很多重复状态,且重复状态的到达它的状态无关(无后效性问题:在递归函数中可变参数确定了之后,返回值就确定的)
但是汉诺塔,n皇后问题是有后效性问题
利用递归改动态规划套路:
1.确定dp表的大小(根据递归函数的可变参数确定dp表的维度,一维,二维,三维...)
2.在dp[][]表中,首先将需要的位置标识出来
3.回到递归函数中,在base case中,把不被依赖的位置填好
4.然后分析普遍位置的依赖关系
看依赖的位置如 i, j 这个状态需要依赖哪几个状态,如 i + 1, j 和 i, j+1这两个状态的关系,
然后通过这个依赖关系,利用3步中的不被依赖的状态,倒推回去,得到2步中标识的位置