动态规划的定义
将原问题拆解成若干子问题 ,同时保存子问题的答案,使得每个子问题只求解一次,最终获得原问题的答案。
动态规划的解析
动态规划的问题是由递归问题演变而来,如下图所示:
例子
通过斐波那契数列引出动态规划:
- 自顶向下的解决斐波那契数列问题
public class Solution {
public int Fibonacci(int n) {
if(n == 0) {
return 0;
}
if(n == 1) {
return 1;
}
return Fibonacci(n-1) + Fibonacci(n-2);
}
}
- 自底向上的解决斐波那契数列问题
public class Solution {
public int Fibonacci(int n) {
int[] res = {0, 1};
if(n < 2) {
return res[n];
}
int first = 0;
int second = 1;
int fibn = 0;
for(int i = 2; i <= n; i++) {
fibn = first + second;
first = second;
second = fibn;
}
return fibn;
}
}