Dynamic Programming :动态规划方法

先用斐波那契数列引入:1 ,1 ,2 ,3 ,5  ,8  ,13 ........

 

斐波那契数列的公式总结为:

n=1或n=2时,fib(n)=1

n>2时,fib(n)=fib(n-1)+fib(n-2)

 

如果用电脑机械的计算斐波那契数列如fib(6),则如下图所示:

会发现绿色框区域和黄色框区域进行了相同的计算,同时红色框区域也在绿色框、黄框区域内进行了运算(重叠子问题)。进行了并无必要的重复运算。

解决方法是将值保存,如fib(4)的值计算一次后保存,当fib(4)再被调用时,直接使用其值。

即可以计算一次fib(1),fib(2),fib(3),fib(4),fib(5)的值,当计算fib(6)时,就会很快的出结果。这就是动态规划的思想。

 

下面是一道动态规划的问题:

有八个任务,每个任务上红色字标注的为完成对应任务获得的报酬。横轴代表了花费的时间。任务有时间冲突性,比如如果选择了任务1,那么任务2和任务3就无法完成。求解该如何选择任务,才能赚得最多的收入?(最优解问题)

解题方法:选或不选

设最优解问题OPT(i),当i=8时,有两种状态,即选择做第八个任务和不做第八个任务:

当选做第八个任务时,首先4块钱到手;此时6、7任务无法选择,可以挑选前五个任务中最好的结果去做即OPT(5)

如果不做第八个任务,则直接选择前七个任务中的最好结果即OPT(7)

比较选和不选两种方案,哪个赚的更多,哪个就是最佳方案。

其中V表示,选择i任务赚到的钱,prev(i)表示硬要做第i个任务时,之前可以做的任务值。比如硬要做任务8,则6、7做不了,只能从5开始,prev(8)=5.以此类推得到表格:

 

进一步计算出每步的最优解(从1开始对每步进行选和不选的大小比较):

红色为每步最优解;蓝色标注的为最优解所选择的任务。