9、一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
首先还是来找找规律......
n=1,f(1)=1
n=2,f(2)=2
n=3,f(3)=f(3-1)+f(3-2)+f(3-3),该等式表示要跳上3级台阶最后一跳有三种跳法,最后一跳可以是1或2或3
...
n-1,f(n-1)=f(n-1-1)+f(n-1-2)+f(n-1-3)+...+f(n-1-(n-1))=f(0)+f(1)+f(2)+..+f(n-2)
n,f(n)=f(n-1)+f(n-2)+f(n-3)+...+f(n-(n-1))+f(n-n)=f(0)+f(1)+f(2)+..+f(n-2)+f(n-1)
将等式f(n-1)带入等式f(n)得到f(n)=f(n-1)+f(n-1)=2*f(n-1),从n=2开始即可使用该等式进行计算。
public class Solution {
public int JumpFloorII(int target) {
int a=1,c=0;
if(target==0){
return 0;
}else if(target==1){
return 1;
}else{
for(int i=2;i<=target;i++){
c=2*a;
a=c;
}
return c;
}
}
}
10、我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
比如n=3时,2*3的矩形块有3种覆盖方法:
首先分析一下题目,像之前跳阶梯的思路,将问题进行分解,小矩阵为2*1,大矩阵为2*n。
当n=1时,覆盖方法种数f(1)=1;
当n=2时,覆盖方法种数f(2)=2;
...
因为大矩阵的宽为2,那我们关注大矩阵的右边,宽为2,要么是用1个小矩阵的长来填充,要么是用两个小矩阵的宽来填充,则如果n=3,f(3)=f(3-1)+f(3-2)=1+2=3
f(n)=f(n-1)+f(n-2) n>=3
类似于斐波那契数列。
public class Solution {
public int RectCover(int target) {
int a=1,b=2,c=0;
if(target==1){
return 1;
}else if(target==2){
return 2;
}else{
for(int i=3;i<=target;i++){
c=a+b;
a=b;
b=c;
}
return c;
}
}
}