http://172.20.6.3/Problem_Show.asp?id=1386

 
有一个W行H列的街道,需要用1*2小砖铺盖,小砖之间互相不能重叠,问有多少种不同的铺法?

数组f的不往后延伸指的是没有对后面产生影响的时候的状态,此时这一列的砖可横可竖但是横着的砖只是从上一列延伸来的而不会延伸到下一列
我觉得复杂度有点扯但是竟然过了,迷。
代码
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int maxn=(<<)+;
int n,m;
long long f[][maxn]={};//不往下延伸的情况下填格子为t的方案数
void dfs(int k,int st,int z,int next1,int num){/*到第几列,转移到的状态, 转移到第几行的数,上一行竖着放的有没有占到这一格,上一个的状态*/
if(z>n){
if(!next1)f[k][st]+=f[k-][num];
return;
}int x=st%(<<z)/(<<(z-)),y=<<(z-);
if(next1){
if(x){dfs(k,st,z+,,num+y);}
return;
}
if(x) dfs(k,st,z+,,num),dfs(k,st,z+,,num+y);
else dfs(k,st,z+,,num+y);
}
int main(){
scanf("%d%d",&n,&m);
if((n&)&&(m&)){printf("%d\n",);return ;}
int ma=<<n;ma-=;
for(int i=;i<=ma;i++){
int t=,x=i;int next1=,ff=;
while(x){
if(x%t){
if(next1==) next1=;
else next1=;
}else if(next1){ff=;break;}
x/=t;
}if(!ff)f[][i]=;
}
for(int k=;k<=m;k++){
for(int i=;i<=ma;i++){
dfs(k,i,,,);
}
}
printf("%I64d",f[m][ma]);
return ;
}

最新文章

  1. oracle--逻辑对象--bai
  2. C#编写window服务,一步一步(1)
  3. java压缩
  4. WebView注入Java对象注意事项
  5. Android性能优化之运算篇
  6. emacs下安装pip
  7. C#采用Winform实现类似Android的Listener
  8. 转载 C# BindingSource
  9. Linux grep和find的区别
  10. Django学习笔记(精简版)
  11. [转][JSBSim]使用VS2015编译JSBSim
  12. jetty隐藏版本号教程
  13. shell-dict-uniq-count
  14. 文本处理三剑客之 sed详解
  15. (转)Mysql 多表查询详解
  16. Banner设计的视觉导向原则分析
  17. Oracle存储过程--案例
  18. TCP的拥塞控制 (三)
  19. 【二分答案】【最大流】bzoj3993 [Sdoi2015]星际战争
  20. C#拦截系统消息的方法-Application.AddMessageFilter

热门文章

  1. 【vijos】P1448 校门外的树
  2. linux下暴力破解工具hydra【转】
  3. mysql查询语句的执行顺序(重点)
  4. 【Android XML】Android XML 转 Java Code 系列之 介绍(1)
  5. 5-3 Linux内核计时、延时函数与内核定时器【转】
  6. MVC自定义路由实现URL重写,SEO优化
  7. 网站服务器压力Web性能测试(3):http_load:测试web服务器的吞吐量与负载
  8. ES6 module语法加载 import export
  9. 赤峰项目目前的mysql配置项目
  10. mysql中的制表符替换