动态规划定义
动态规划是分治思想的延伸,通俗一点来说就是大事化小,小事化无的艺术。
在将大问题化解为小问题的分治过程中,保存对这些小问题已经处理好的结果,并供后面处理更大规模的问题时直接使用这些结果。
动态规划具备了以下三个特点
1. 把原来的问题分解成了几个相似的子问题。
2. 所有的子问题都只需要解决一次。
3. 储存子问题的解。
动态规划问题一般从以下四个角度考虑:(解题模板)
1. 状态定义
2. 状态间的转移方程定义
3. 状态的初始化
4. 返回结果
第一题 斐波那契数列
//方法一:递归
public class Solution {
public int Fibonacci(int n) {
// 初始值
if(n <= 0)
return 0;
if(n == 1 || n == 2)
return 1;
// 斐波那契公式: F(n)=F(n-1)+F(n-2)
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
}
但是使用递归的方法时间复杂度O(2^N),随着数增大会发生指数爆炸的增长,不仅效率低下还会导致栈溢出.所以可以使用本篇的主角:动态规划;
解题模板(DP)
1. 状态定义: 求出n项的数 F(n)
2. 状态间的转移方程定义: F(n)=F(n-1)+F(n-2)
3. 状态的初始化: F(1)=F(2)=1
4. 返回结果: 返回 F(N) 的值
public class Solution {
public int Fibonacci(int n) {
// 初始值
if(n <= 0)
return 0;
// 申请一个数组,保存子问题的解,