记忆化搜索
前言
动态规划呢其实是理查德·贝尔曼在研究多阶段决策过程的优化问题时,提出了著名的最优化原理。所以说动态规划的本质其实是记忆化搜索。
正文
所以说我们这里以斐波那契问题为例
众所周知斐波那契用函数表示是:
f
(
n
)
=
f
(
n
−
1
)
+
f
(
n
−
2
)
f(n) = f(n - 1) + f(n - 2)
f(n)=f(n−1)+f(n−2)
当
n
=
5
n=5
n=5 时,我们会发现一个
f
f
f 函数会被调用多次
比如在这个图里我们很容易发现 f ( 3 ) f(3) f(3) 不仅被 f ( 5 ) f(5) f(5) 调用,还被 f ( 4 ) f(4) f(4) 调用。那么被调用多次的 f ( 3 ) f(3) f(3) 该怎么办呢?其实很简单,我们只需要再用一个数组 g ( i ) g(i) g(i) 表示 f ( i ) f(i) f(i) 的值,这样我们可以花费 O ( 1 ) O(1) O(1) 的时间来查找 f ( i ) f(i) f(i) 了。
那么我们直接快乐的贴上代码吧
int fib(int n) {
if (memo[n] == -1) {
if (n <= 1) memo[n] = 1;
else memo[n] = fib2(n - 1) + fib2(n - 2);
}
return memo[n];
}