下面的例题来自剑指offer,都是使用动态规划代替递归避免重复求解的例子。
1.斐波那契数列
题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 n<=39
思路:
斐波拉数列f(n)=f(n-1)+f(n-2);如果使用递归,会造成很多重复求解,所以使用使用动态规划,斐波拉数列是非常典型的使用动态规划求解的例子。
public class Solution {
public int Fibonacci(int n) {
if(n==0)
return 0;
if(n==1)
return 1;
int[] record=new int[n+1];
record[0]=0;
record[1]=1;
for(int i=2;i<=n;i++){
record[i]=record[i-1]+record[i-2];
}
return record[n];
}
}
2.跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
与斐波拉契数列数列类似f(n)=f(n-1)+f(n-2):
public class Solution {
public int JumpFloor(int target) {
if(target==0)
return 1;
if(target==1)
return 1;
int count1=1;
int count2=1;
int count=0;
for(int i=2;i<=target;i++){
count=count1+count2;
count1=count2;
count2=count;
}
return count;
}
}
3.变态跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
公式变为f(n)=f(n-1)+f(n-2)+….f(0);
public class Solution {
public int JumpFloorII(int target) {
int[] record=new int[target+1];
record[0]=1;
for(int i=1;i<=target;i++){
for(int j=0;j<i;j++){
record[i]+=record[j];
}
}
return record[target];
}
}
4.矩形覆盖
题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
public class Solution {
public int RectCover(int target) {
if(target==0)
return 1;
if(target==1)
return 1;
int count1=1;
int count2=1;
int count=0;
for(int i=2;i<=target;i++){
count=count1+count2;
count1=count2;
count2=count;
}
return count;
}
}