什么是动态规划?
- 动态规划(Dynamic Programming)
这里的“programming”并不是指编程,而是表示填充表格 - 定义
动态规划=递归+备忘录
递归:用于求解子问题。
备忘录:将已计算的值存储在表中。 - 实现方法
自底向上:从最小的可能输入参数开始对函数进行调用,然后逐步增大参数值来计算其返回值。在计算返回值的时候,把已经计算的值存在备忘中。
自顶向下:将问题分解为一系列子问题。对每一个子问题进行求解,并记住结果。
举例1
-
斐波那契数列
f(n)=1 n=1,2
f(n)=f(n-1)+f(n-2) n>2 -
递归实现
/** * 斐波那契数列 * f(n)=1 (n=1,n=2); * f(n)=f(n-1)+f(n-2); (n>2); * * @param n * @return */ public static long Fibonacci(int n) { if (n == 1) { return 1L; } if (n == 2) { return 1L; } return Fibonacci(n - 1) + Fibonacci(n - 2)