定义
动态规划中一个经典的问题就是0-1背包问题,0-1的意思也就是说对于每个元素/选项,只有两个选择,要么选择,要么不选择。动态规划的分析过程为:确定推导公式/状态转移方程,子元素结构/独立子结构,确定边界,保存中间数据/备忘录。动态规划过程的核心要素就是确定推导公式,类似于初中数学上经常遇到的这样一个场景:
已知:
a(n)=a(n-1)+a(n-2);
a(0)=a(1)=1;
求解a(10)的值,过程就是:
a(10)=a(9)+a(8);
a(9)=a(8)+a(7);
......
a(2)=a(1)+a(0);
这样的计算过程大家都很熟悉,其中:a(n)=a(n-1)+a(n-2)就是所谓的状态转移方程,a(9),a(8)就是独立的子结构,a(0),a(1)就是边界,上面的计算过程常用的有两种方式:
(1)由下向上
计算a(2),根据(a(2),a(1))计算a(3)...,直到得出a(10),也就是常用的迭代方式。
while i<=10:
a(i)=a(i-1)+a(i-2)
i++
(2)由上向下
根据a(9),a(8)的值计算a(10),根据a(8),a(7)的值计算a(9)...,直到a(1),a(0),这就是所谓的递归。
f(x):
if(x==0||x==1) {
return 1
}else{
return f(x-1)+f(x-2)
}
迭代过程没什么好说的,观察递归过程可以发现:
a(10)
=a(9)+a(8)
=( a(8)+a(7) )+a(8)
=( a(7)+a(6) )+( a(6)+a(5) )+( a(7)+a(6) )
即递归的展开过程存在许多重复使用的元素,例如这里的a(7)、a(6),如果继续展开会重复使用更多的a(3)、a(2),所以如果递归的计算过程如:
f(x):
if(x==0||x&#