题目:http://acm.hdu.edu.cn/showproblem.php?pid=2190
思路:明显我们要寻找 边长为n和边长为n-1,n-2,n-3·····的规律,这样得出一个递推公式就能方便的得出f(n)(边长为n的值)
由于只有两种类型的地板砖,2*2 1*1,所以最后加入的一行,可能是1*1的砖块,也可能是2*2砖块的一部分,所以 f(n)就和f(n-1)和f(2)有关
接下来推导:
由数学概论论可知:
两种个情况,不同情况之间用加号
同一情况下,的下一步操作的方法数 之间用乘法
1 第n行放的是1*1的砖块
所以只需要在f(n-1)的基础上放即可,且1*1砖块的方法只有一种
2 第n行放的是2*2砖块的一部分
所以在f(n-2)的基础上放即可,本来有三种的,但是舍弃1*1的情况,因为和上述情况重复,2*2放左边或右边,两种情况
结论:f(n)=f(n-1)*1+f(n-2)*2
代码:
#include<iostream> #include<cstdio> using namespace std; int main() { int c; int sch[32]; sch[1]=1; sch[2]=3; sch[3]=5; for(int i=4;i<31;i++) sch[i]=sch[i-1]+sch[i-2]*2; cin>>c; while(c--) { int n; cin>>n; cout<<sch[n]<<endl; } return 0; }