sgu 131 状压DP
-
棋盘覆盖(二)
时间限制:1000 ms | 内存限制:65535 KB- 描述
- The banquet hall of Computer Scientists' Palace has a rectangular form of the size M x N (1<=M<=9, 1<=N<=9). It is necessary to lay hardwood floors in the hall. There are wood pieces of two forms:
1) rectangles (2x1)
2) corners (squares 2x2 without one 1x1 square)
You have to determine X - the number of ways to cover the banquet hall.
Remarks. The number of pieces is large enough. It is not allowed to leave empty places, or to cover any part of a surface twice, or to saw pieces.
- 输入
- The first line contains natural number M. The second line contains a natural number N.
- 输出
- First line should contain the number X, or 0 if there are no solutions.
- 样例输入
-
2 3
- 样例输出
-
5 题意:
有1*2的砖块和2*2但缺一个角的砖块,用他们恰好铺满m*n的矩形有几种方案。
代码://思路就是:状压,从上到下铺dfs,sta表示本行的状态,next表示下一行的状态,每次要把sta铺满
//,next随之变化。最后要m+1行的状态为0才可以。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
ll dp[][<<];
int n,m;
bool chak(int sta,int x){
int tmp=(sta&(<<x));
return !tmp;
}
void dfs(int sta,int next,int col,int row,ll w){
if(col==n){
dp[row+][next]+=w;
return;
}
if(sta&(<<col)) dfs(sta,next,col+,row,w); //不放
else{
int st=(sta|(<<col));
if(chak(next,col)){
dfs(sta|(<<col),next|(<<col),col+,row,w);//竖着的1*2
if(col+<n&&chak(sta,col+))
dfs(st|(<<(col+)),next|(<<col),col+,row,w);//缺右上角的2*2
st=(next|(<<col));
if(col+<n&&chak(next,col+))
dfs(sta|(<<col),st|(<<(col+)),col+,row,w);//缺右下角的2*2
if(col->=&&chak(next,col-))
dfs(sta|(<<col),st|(<<(col-)),col+,row,w);//缺左下角的2*2
}
st=(sta|(<<col));
if(col+<n&&chak(sta,col+)){
dfs(st|(<<(col+)),next,col+,row,w);//横着的1*2
if(chak(next,col+))
dfs(st|(<<(col+)),next|(<<(col+)),col+,row,w);//缺左上角的2*2
}
}
}
int main()
{
while(scanf("%d%d",&m,&n)==){
memset(dp,,sizeof(dp));
dp[][]=;
int N=(<<n);
for(int i=;i<=m;i++){
for(int j=;j<N;j++){
if(dp[i][j])
dfs(j,,,i,dp[i][j]);
}
}
printf("%lld\n",dp[m+][]);
}
return ;
}
sgu 131 状压DP的更多相关文章
- SGU 223 Little Kings(状压DP)
Description 用字符矩阵来表示一个8x8的棋盘,'.'表示是空格,'P'表示人质,'K'表示骑士.每一步,骑士可以移动到他周围的8个方格中的任意一格.如果你移动到的格子中有人质(即'P'), ...
- zoj3802:easy 2048 again(状压dp)
zoj月赛的题目,非常不错的一个状压dp.. 题目大意是一个一维的2048游戏 只要有相邻的相同就会合并,合并之后会有奖励分数,总共n个,每个都可以取或者不取 问最终得到的最大值 数据范围n<= ...
- 2018.12.26 考试(哈希,二分,状压dp)
T1 传送门 解题思路 发现有一个限制是每个字母都必须相等,那么就可以转化成首尾的差值相等,然后就可以求出\(k-1\)位的差值\(hash\)一下.\(k\)为字符集大小,时间复杂度为\(O(nk) ...
- HDU 3247 Resource Archiver(AC自动机 + 状压DP + bfs预处理)题解
题意:目标串n( <= 10)个,病毒串m( < 1000)个,问包含所有目标串无病毒串的最小长度 思路:貌似是个简单的状压DP + AC自动机,但是发现dp[1 << n][ ...
- POJ 2923 Relocation(状压DP)题解
题意:有2辆车运货,每次同时出发,n(<10),各自装货容量c1 c2,问最少运几次运完. 思路:n比较小,打表打出所有能运的组合方式,用背包求出是否能一次运走.然后状压DP运的顺序. 代码: ...
- HDU 4272 LianLianKan(状压DP)题解
题意:一个栈,每次可以选择和栈顶一样的数字,并且和栈顶距离小于6,然后同时消去他们,问能不能把所有的数消去 思路:一个数字最远能消去和他相距9的数,因为中间4个可以被他上面的消去.因为还要判断栈顶有没 ...
- HDU 3681 Prison Break(状压DP + BFS)题解
题意:一张图,F是起点,Y是必须要到的点,D不能走,G可以充电.可以往四个方向走,每走一步花费一个电,走到G可以选择充满电或者不充,每个G只能充一次.问你走遍Y的最小初始点亮.number(G) + ...
- HDU 4628 Pieces(状压DP)题解
题意:n个字母,每次可以删掉一组非连续回文,问你最少删几次 思路:把所有回文找出来,然后状压DP 代码: #include<set> #include<map> #includ ...
- 【模拟8.11】星空(差分转化,状压DP,最短路)
一道很好的题,综合很多知识点. 首先复习差分: 将原来的每个点a[i]转化为b[i]=a[i]^a[i+1],(如果是求和形式就是b[i]=a[i+1]-a[i]) 我们发现这样的方便在于我 ...
随机推荐
- JS验证验证服务器控件
JS验证验证服务器控件 <script language="javascript" type="text/javascript"> /******* ...
- nuget程序包还原失败:未能解析此远程名称
一个简便的方法就是取消下载缺少的程序包. 步骤如下: 1,工具--NuGet程序包管理器--程序包管理器设置 2,NuGet Package Manager--常规,取消勾选.
- Qt-excel文件操作方法
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt-excel文件操作方法 本文地址:http://techieliang.com/ ...
- 加密和数字签名工具GPG
转载: 源文件位置:http://blog.chinaunix.net/uid-9525959-id-2001824.html GPG [功能] GPG是加密和数字签名的免费工具,大多用于加密信息的 ...
- java 基础 --集合--012
1, 数组与集合 A:长度不同 数组的长度固定,集合的长度可变 B:内容不同 数组里存储的是同一种类型的元素,而集合可以存储不同类型的元素 C:元素的数据类型问题 数组可以存储基本数据类型,也可以存储 ...
- Visual C++中对运行时库的支持
原文地址:http://blog.csdn.net/wqvbjhc/article/details/6612099 一.什么是C运行时库 1)C运行时库就是 C run-time library,是 ...
- 安装多个版本JDK相关问题
一.前言 因敝人计算器上面安装了多个版本的JDK,其中包括JDK1.6.JDK1.7.JDK1.8,想通过变换环境变量(JAVA_HOME)的形式切换不同的JDK,但是我在安装了JDK1.7并且配置了 ...
- jstat查看jvm的GC
jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上 ...
- 【bzoj4401】块的计数 结论题
题目描述 给出一棵n个点的树,求有多少个si使得整棵树可以分为n/si个连通块. 输入 第一行一个正整数N,表示这棵树的结点总数,接下来N-1行,每行两个数字X,Y表示编号为X的结点与编号为Y的结点相 ...
- hdu 1528 Card Game Cheater (二分匹配)
Card Game Cheater Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...