UVA 11270 Tiling Dominoes(轮廓线DP经典)
2015-08-09 19:35
197 查看
题意:用1*2的骨牌覆盖n*m的棋盘有多少种方法
这道题注意一下不要按照大白书上把maxn开成15就好,因为每次都要memset如果开到15会tle,开到11就可以
这道题注意一下不要按照大白书上把maxn开成15就好,因为每次都要memset如果开到15会tle,开到11就可以
#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #include<string> #include<map> #include<set> #define eps 1e-6 #define LL long long #define pii (pair<int, int>) //#pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; //const int INF = 0x3f3f3f3f; //freopen("input.txt", "r", stdin); int n, m, cur; const int maxn = 11; LL d[2][1<<maxn]; int main() { while(scanf("%d%d", &n, &m) == 2) { if(m > n) swap(m, n); cur = 0; memset(d[cur], 0, sizeof(d[cur])); d[cur][(1<<m)-1] = 1; for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) { cur ^= 1; memset(d[cur], 0, sizeof(d[cur])); for(int k = 0; k < (1<<m); k++) { if(k&(1<<(m-1))) d[cur][(k<<1)^(1<<m)] += d[1-cur][k]; //不放 if(i && !(k&(1<<(m-1)))) d[cur][(k<<1)+1] += d[1-cur][k]; if(j && !(k&1) && (k&(1<<(m-1)))) d[cur][(k<<1)^(1<<m)|3] += d[1-cur][k]; } } LL ans = d[cur][(1<<m)-1]; printf("%lld\n", ans); } return 0; }
相关文章推荐
- 单例singleton
- SQL Server 2005为数据库设置用户名和密码的方法
- Java字符串题目--删除给定字符串中出现次数最少的字符
- 开发一个Servlet程序及对Servlet的一些思考
- c语言中的函数
- C# 与MySQL
- android多线程断点续传下载
- 一致性哈希算法与Java实现
- OC中继承和复合
- 在前端设计响应式设计
- oracle:ora-12560:tns:协议适配器错误
- CMVS-PMVS配置
- Ajax的简单总结
- 545E. Paths and Trees
- c#中xml序列化 和binary 序列化
- 未使用调试信息生成二进制文件
- php数组与字符串的转换函数
- 求逆序数
- mayavi安装
- 转化Csv,excel到语言相关的文件