UVa 10359 - Tiling
来源:互联网 发布:软件测试流生命周期 编辑:程序博客网 时间:2024/05/17 22:51
题目:给你一个2*n的地面,用1*2和2*2的地板砖铺满,有多少种不同方案。
分析:组合数学,动态规划。直接找到地推关系求解。
因为,只可能是最后一列是一个整体(1种情况)或者最后两列是一个整体(两种情况);
所以,有递推公式:f(n)= f(n-1)+ 2*f(n-2);
可以使用动态规划或母函数(an = (pow(2,n+1)-pow(-1,n+1))/ 3)求解。
说明:大整数运算,这里采用dp求解,貌似快速幂会快点╮(╯▽╰)╭。
- #include <algorithm>
- #include <iostream>
- #include <cstdlib>
- #include <cstring>
- #include <cstdio>
- #include <cmath>
- using namespace std;
- int ans[255][101],two[101];
- void copy_array(int *a, int *b)
- {
- for (int i = 0; i < 100; ++ i)
- a[i] = b[i];
- }
- void add_array(int *c, int *a, int *b)
- {
- for (int i = 0; i < 100; ++ i)
- c[i] = 0;
- for (int i = 0; i < 100; ++ i) {
- c[i] += a[i]+b[i];
- if (c[i] > 9) {
- c[i+1] += c[i]/10;
- c[i] %= 10;
- }
- }
- }
- void output_array(int *a)
- {
- int end = 100;
- while (end && !a[end]) -- end;
- while (end >= 0) printf("%d",a[end --]);
- printf("\n");
- }
- int main()
- {
- memset(ans, 0, sizeof(ans));
- ans[0][0] = 1;ans[1][0] = 1;
- for (int i = 2; i < 252; ++ i) {
- add_array(two, ans[i-2], ans[i-2]);
- add_array(ans[i], ans[i-1], two);
- }
- int n;
- while (~scanf("%d",&n))
- output_array(ans[n]);
- return 0;
- }
0 0
- UVA 10359 Tiling
- UVa:10359 Tiling
- UVa 10359 - Tiling
- UVa 10359 - Tiling
- UVa 10359 - Tiling
- uva 10359Tiling
- uva 10359 - Tiling(规律)
- UVA 10918 Tri Tiling
- UVA 10918 Tri Tiling
- UVa:10918 Tri Tiling
- UVA - 11270 Tiling Dominoes
- UVa 10918 - Tri Tiling
- UVa 10918 - Tri Tiling
- uva 10918Tri Tiling
- Tiling Dominoes UVA
- 【DP】 UVA 11270 Tiling Dominoes
- uva 10918 - Tri Tiling(规律)
- UVA 11270 Tiling Dominoes(插头DP)
- WPF 不包含适合于入口点的静态“Main”方法
- dgsfdh4356
- gfdshgfdsh46987
- c++ primner plus 10.1
- 重载、隐藏和重写(有的书叫“覆盖”)的区别?
- UVa 10359 - Tiling
- Cassandra数据分布之5分区器
- jQuery插件第五十五:批量获取值返回Json字符串
- position属性absolute与relative 详解
- java解惑之Calendar
- Apache ZooKeeper交流
- do...while(0)的妙用
- [POI2000]啤酒厂选址
- 输入一些数,按从小到大排序