每次要么横着放两个,要么竖着放一个。
刚开始采用dfs做,方法正确但超时了:
int ans=0;
int n;
void dfs(int x) //x是当前到达的x值,x<=n
{
if(x>n)
return;
if(x==n) //该方案成功,方案数+1
{
ans++;
return;
}
//要么就是两个横着放
dfs(x+2);
//要么就是一个竖着放
dfs(x+1);
}
int rectCover(int number) {
n=number;
dfs(0); //初始的x=0
return ans;
}
当然,能把dfs用dp来做,才是最好的。
然后发现——这就是跳台阶问题啊,每次要么x+1(一步),要么x+2(两步),因此直接写跳台阶问题的代码,AC:
int f[500000];
int rectCover(int number) {
f[0]=0;
f[1]=1;
f[2]=2;
for(int i=3;i<=number;i++)
f[i]=f[i-1]+f[i-2];
return f[number];
}