动态规划具备了以下三个特点
- 把原来的问题分解成了几个相似的子问题。
- 所有的子问题都只需要解决一次。
- 储存子问题的解。
1. 斐波那契数列
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。(n<=39)
题目来源:牛客网-斐波那契数列
用递归的方法:
// 第 n 项是前两项之和
public class Solution {
public int Fibonacci(int n) {
if(n <= 0) return 0;
else if(n <=2) return 1;
return Fibonacci(n-2)+Fibonacci(n-1);
}
}
用动态规划:
----分析初始值、状态递推、返回结果----
状态:f(n)
初始值:f(n<=0)=0; f(1)=f(2)=1;
状态递推:f(n)=f(n-1)+f(n-2)
返回结果:f(n)
第 n 项是前两项之和,用一个数来记录每次第 i 项的值,并且不断更新 (i-1) 和 (i-2) 项的值,用两个数来保存这两个子问题的解。
public class Solution {
public int Fibonacci(int n) {
if(n<=0) {
return 0;
} else if(n==1 || n==2) {
return 1;
}
int fib1 = 1;
int fib2 = 1;
int result = 0;
for(int i=3; i<=n; i++) {
result = fib1 + fib2