题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
这道铺地砖题与菲波那切数列题和青蛙跳台阶题是一个题,都可以用递推思想和动态规划思想解决。
- if target<1, return 0;
- if target =1,return 1; 只有一种竖直摆放方法。
- if target =2, return 2;横竖两种摆放方法。
- if target =n,return f(n-1)+f(n-2); 如果最后摆一竖列,总共的摆放方法有f(n-1),如果最后摆一横列,总共摆放方法有f(n-2).
代码如下:动态规划解题
int rectCover(int number)
{
if(number<1)
return 0;
int *dp=new int[number+1];
dp[0]=0;
dp[1]=1;
dp[2]=2;
for(int i=3;i<=number;i++)
dp[i]=dp[i-1]+dp[i-2];
return dp[number];
delete[]dp;
}
递推解题:
int rectCover(int number)
{
int count=0;
if(number<1)
return 0;
else if(number==1||number==2)
return count=number;
int f1=1;//f1 f2 不能写到for循环里面
int f2=2;
for(int i=3;i<=number;i++){
count=f1+f2;
f1=f2;
f2=count;
}
return count;
}