POJ 2411 Mondriaan's Dream (状压DP,骨牌覆盖,经典)
2015-10-08 10:53
113 查看
题意:
用一个2*1的骨牌来覆盖一个n*m的矩形,问有多少种方案?(1<=n,m<=11)
AC代码
用一个2*1的骨牌来覆盖一个n*m的矩形,问有多少种方案?(1<=n,m<=11)
//#include <bits/stdc++.h> #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <deque> #include <map> #include <algorithm> #include <vector> #include <iostream> #define pii pair<int,int> #define INF 0x3f3f3f3f #define LL long long #define ULL unsigned long long using namespace std; const double PI = acos(-1.0); const int N=11; LL dp[2][1<<11], cur; LL cal(int n,int m) { if(n==m&&n%2==1) return 0; if(n<m) swap(n,m); memset(dp[0],0,sizeof(dp[0])); dp[cur=0][(1<<m)-1]=1; for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { cur^=1; memset(dp[cur],0,sizeof(dp[cur])); int r=(1<<m)-1; for(int s=0; s<(1<<m); s++) { LL v=dp[cur^1][s]; if( (s&(1<<m-1))==0 ) //必须放竖 dp[cur][(s<<1)+1]+=v; else { dp[cur][(s<<1)&r]+=v; //不放 if( j>1 && (s&1)==0 ) //放横 dp[cur][((s<<1)+3)&r]+=v; } } } } return dp[cur][(1<<m)-1]; } int main() { freopen("input.txt","r",stdin); int n, m; while(scanf("%d%d",&n,&m),n+m) printf("%lld\n",cal(n,m)); return 0; }
AC代码
相关文章推荐
- 天气代码调用代码示例
- 计算机图形学——基于3D游戏开发技术——第一章游戏模型
- 使用VS2012自带数据库发布网站
- MySQL引擎
- su和sudo
- 计算机视觉:随机森林算法在人体识别中的应用
- 运用Autoconf和Automake生成Makefile的学习之路
- vh,可视窗口100%高
- 选择排序
- 解决centos7下tomcat启动正常,无法访问项目的问题
- jQuery初始化的几张方法
- Java值传递与引用传递
- 如何利用子视图
- Android项目中的双击退出应用
- STM32—DAC配置
- 深入探索透视投影变换
- 数据结构和算法学习(6)-递归
- 【莫队】bzoj 3781,bzoj 2038,bzoj 3289
- Asp.net Web.Config - 配置元素 httpCookies
- 今天拦截到一个SQL注入 有兴趣的帮忙分析一下!