您的位置:首页 > 其它

UVa 10918 - Tri Tiling

2015-04-15 23:48 288 查看
题目:给你一个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
 << 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: