据说每一个dfs,都能用动态规划思想做出来.
首先要明白dfs与动态规划的一些小要点
1)dfs重在通过使用递归来使用不同的选择,通过使用形参的改变实现不同情景的改变(形参既包括了代价,又包含了结果)
2)动态规划则重在使用递归的同时,再使用数组存储,从而使用不同的选择(这里通过形参的改变来改变代价,通过数组元素值的加减来改变结果)
这里主要讲述动态规划
首先看一下动态规划通常的使用格式
1)首先需要一个dp[ ][ ]来存储每个环节的值(动态规划的灵魂)
2)然后就是形参的设置上,会有代价参数与边界参数
(参数上和普通递归基本一致,只不过没有结果参数,所谓代价参数,如下就是 l 和 r 由下面的dp[ l ][ r ] = max(........)递归中的改变可知,边界参数 i 用来结束)
3)之所以没有结果参数,是因为数组存储在一定程度上减少了对递归的依赖,
数组通过使用 dfs( .. ....) + 代价带来的后果 代替了 结果参数,如dp[ l ][ r ] = max(dfs(.....) + b[ i ] * a[ l ] ,dfs(....))
4)关于分支 , 一般会出现多个 if 之类的语句,分清楚什么情况下进行递归,什么情况下结束,什么情况下直接可以返回值
5)关于返回值,每个分支都要有返回值,都和 dp [ ][ ] 有关,要么是直接返回,要么是为它赋值
6)一般这种需要遍历全部的dfs都是求最值,所以需要在给dp [ ] [ ] 赋值时,将情况用max之类的进行以下比较,然后就完成了所有工作