标签:
题目:给你一个3*n的地面,用1*2的地板砖铺满,问有几种方法。
分析:组合数学,动态规划。首先找到地推关系。
只有偶数才有意义,奇数的总面积为奇数一定不成立。一次我们以两列为一个单位考察。
如果,最后2列构成一个整体的部分(3种情况,2*3的3中实现),则有3*f(n-2)种方法;
如果,最后4列构成一个整体的部分(2种情况,上下翻转实现),则有2*f(n-4)种方法;
...
因此,有递推公式: f(n)= 3*f(n-2)+ 2(f(n-4)+ f(n-6)+ ...);
整理化简可以得到:f(n)- 4*f(n-2)+ f(n-4) = 0;
可以利用动态规划或者母函数求解。
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> using namespace std; int f[32]; int main() { memset(f, 0, sizeof(f)); f[0] = 1;f[2] = 3; for (int i = 4; i < 31; i += 2) f[i] = 4*f[i-2] - f[i-4]; int n; while (cin >> n && n >= 0) { cout << f[n] << endl; //母函数 //cout << (int)(((3+sqrt(3.0))*pow(2+sqrt(3.0), n/2)+(3-sqrt(3.0))*pow(2-sqrt(3.0), n/2))/6+0.01) << endl; } return 0; }
标签:
原文地址:http://blog.csdn.net/mobius_strip/article/details/45066763