HDU 2501 Tiling_easy version
2015-08-22 21:11
369 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2501
2
8
12
171
2731
状态转移方程:dp[i] = dp[i-1] + 2*dp[i-2]
分三种情况:
1.这个格竖着放一个2*1的骨牌,这种情况和data[i-1] 数量相同
2.这个新增加和格和它前面那个格合起来放一个2*2的骨牌,这种情况和data[i-2]的数量相同
3.这个新增加的格和它前面那个格合起来横着放两个2*1的骨牌,这种情况和data[i=2]数量也相同
Problem Description
有一个大小是 2 x n 的网格,现在需要用2种规格的骨牌铺满,骨牌规格分别是 2 x 1 和 2 x 2,请计算一共有多少种铺设的方法。Input
输入的第一行包含一个正整数T(T<=20),表示一共有 T组数据,接着是T行数据,每行包含一个正整数N(N<=30),表示网格的大小是2行N列。Output
输出一共有多少种铺设的方法,每组数据的输出占一行。Sample Input
32
8
12
Sample Output
3171
2731
状态转移方程:dp[i] = dp[i-1] + 2*dp[i-2]
分三种情况:
1.这个格竖着放一个2*1的骨牌,这种情况和data[i-1] 数量相同
2.这个新增加和格和它前面那个格合起来放一个2*2的骨牌,这种情况和data[i-2]的数量相同
3.这个新增加的格和它前面那个格合起来横着放两个2*1的骨牌,这种情况和data[i=2]数量也相同
[code]#include <stdio.h> #include <iostream> #include <string.h> #include <string> using namespace std; long long dp[33][33]; long long dfs(int a, int b) { if (dp[a][b]) return dp[a][b]; if (a == b) { if (a-1 > 0 && b-1 > 0) { dp[a][b] += dfs(a-1, b-1); } if (a-2 > 0 && b-2 > 0) { dp[a][b] += 2*dfs(a-2, b-2); } } return dp[a][b]; } int main() { #ifndef ONLINE_JUDGE //freopen("1.txt", "r", stdin); #endif int t, n; memset(dp, 0, sizeof(dp)); dp[1][1] = 1; dp[2][2] = 3; dfs(30, 30); cin >> t; while(t--) { cin >> n; cout << dp << endl; } return 0; }
相关文章推荐
- Codeforces Round #316 (Div. 2)
- [Leetcode] Implement strStr()
- RSA密钥证书生成(Python&C#)
- 文件系统
- Dsicuz x2.5去掉域名后面的/forum.php
- 如今仍在工作的12名最“屌”的程序员
- swddude -- A SWD programmer for ARM Cortex microcontrollers.
- C++类的使用案例
- 重置Centos 7 Root密码的方式
- Struts2学习(一)建立项目需注意问题
- 有了支付宝,为什么还需要蚂蚁聚宝
- java中println与print的区别,以及print字符输出
- 第一次测试HTML和CSS
- mysql主从搭建-源码篇
- spring类扫描器
- 今天辛辛苦苦写了一篇
- LeetCode_Lowest Common Ancestor of a Binary Search Tree (Binary Tree)
- 唐纳德·克努特 (Donald Ervin Knuth)
- java通过抛异常来返回提示信息
- iOS中对象属性的归档和解档(runtime+KVC)快捷解决方案