题目链接:

http://poj.org/problem?id=2411

题目意思:

给一个n*m的矩形区域,将1*2和2*1的小矩形填满方格,问一共有多少种填法。

解题思路:

用轮廓线可以过。

对每一个格子,枚举上一个格子的状态,得到当前格子的所有状态值。

dp[cur][s]表示当前格子的轮廓线状态为s的情况下的总数

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll long long
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
using namespace std; /*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
*/
ll dp[2][1<<15]; //dp[cur][s]表示当前格子的轮廓线状态为s的情况下的总数
int n,m,cur; void update(int a,int b)
{
if(b&(1<<m)) //将前一个格子的最高位,如果是1,则置零,并更新
dp[cur][b^(1<<m)]+=dp[1-cur][a];
}
int main()
{
while(scanf("%d%d",&n,&m)&&m+n)
{
//if(m+n)
if(m>n)
swap(n,m);
memset(dp,0,sizeof(dp));
dp[0][(1<<m)-1]=1; //第一行只能横着放,把这个状态初始化为1
cur=0;
int lim=1<<m; for(int i=0;i<n;i++)
for(int j=0;j<m;j++) //对每个格子,从前面一个格子推过来
{
cur^=1;
memset(dp[cur],0,sizeof(dp[cur]));
for(int k=0;k<lim;k++) //枚举前一个格子的所有状态
{
update(k,k<<1); //不放
if(i&&!(k&(1<<(m-1))))//竖着放
update(k,(k<<1)^(1<<m)^1); //将放着的两点置1
if(j&&!(k&1))
update(k,(k<<1)^3); //横着放
}
}
printf("%lld\n",dp[cur][lim-1]);
}
return 0;
}

最新文章

  1. MyBatis:统计数量
  2. javascript中的this和e.target的深入研究
  3. angularjs的一些坑关于 $sec
  4. Linq和Lamda表达式的简单处理方式
  5. WIN7系统下U盘安装Ubuntu双系统
  6. libevent源码分析(一)
  7. 解决:CWnd::SetWindowText报Assertion failure
  8. nginx+lua项目学习
  9. linux ps命令(转载)
  10. [Hive - LanguageManual] Import/Export
  11. 启动weblogic11g一直提示&lt;141281&gt; &lt;unable to get file lock, will retry ...&gt;
  12. Canvas、Paint、的简单使用及辅助类(Path、Shader、简介)
  13. C# - 数据库存取图片
  14. SignalR的实时高频通讯
  15. Saltstack 操作目标,正则匹配,及组管理
  16. Junit4学习(一)新建Junit4工程
  17. javascript中词法环境、领域、执行上下文以及作业详解
  18. kafka消费者启动报错
  19. 16.vue-cli跨域,swiper,移动端项目
  20. [转帖] ASP ASPX 等知识

热门文章

  1. mysql数据库中列转行
  2. (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)
  3. ImageView 各种工具类
  4. nyoj 528 找球号(三)(哈希)
  5. solaris 操作系统配置联网
  6. Github实例教程-创建库、创建主页
  7. 一个简单的文本编辑器。(是在DEV C++下写的)
  8. Android应用开发基础篇(2)-----Notification(状态栏通知)
  9. 非线性规划问题的matlab求解
  10. android raw与assets资源