POJ 2411 Mondriaan'sDream(状压DP)
题目大意:一个矩阵,只能放1*2的木块,问将这个矩阵完全覆盖的不同放法有多少种。
解析:如果是横着的就定义11,如果竖着的定义为竖着的01,这样按行dp只需要考虑两件事儿,当前行&上一行,是不是全为1,不是说明竖着有空(不可能出现竖着的00),另一个要检查当前行里有没有横放的,但为奇数的1。
原代码链接:http://blog.csdn.net/accry/article/details/6607703
首先我个人感觉,横着是11,竖着是01 这个方法很牛逼,然后就是先预处理ok数组,之后就要判断符合的情况,最后写dp方程,先写边界,再写之后。
之后枚举s,s1两种状态,判断s行,s1行 两行在一起是否可行,还有一个有意思的地方就是,中间的行数只要按位与==full-1就可以,但最后一行必须是全为full-1才行!!
#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int INF=0x3f3f3f3f;
typedef long long ll;
typedef unsigned long long ull;
#define fi first
#define se second
#define prN printf("\n")
#define SI(N) scanf("%d",&(N))
#define SII(N,M) scanf("%d%d",&(N),&(M))
#define SIII(N,M,K) scanf("%d%d%d",&(N),&(M),&(K))
#define cle(a,val) memset(a,(val),sizeof(a))
#define rep(i,b) for(int i=0;i<(b);i++)
#define Rep(i,a,b) for(int i=(a);i<=(b);i++) int N,M;
ll dp[1<<11][11];//注意这,状态数是第一维
bool ok[1<<11];
int full; //用来初始化ok数组,这个数组存着可行的状态(就是横着,并且有连着的两个1的时候,这就相当于放了一个横着的1*2木块,
//剩下的0可以放竖着的,但x状态与y状态 按位“|”的时候,如果==full-1 那就可行 )
bool judge(int n)
{
int bit=0;
while(n)
{
if ((n&1))
bit++;
else
{
if ((bit&1))
return false;
}
n>>=1;
}
if ((bit&1))
return false;
return true;
}
bool judge2(int x,int y)
{
if ((x|y)!=full-1)//x与y 这两个状态必须要能完全覆盖两行才能继续进行
return false;
//还有可能是奇数的1的情况,所以要返回ok数组的值
return ok[(x&y)];
} int main()
{
#ifndef ONLINE_JUDGE
freopen("C:\\Users\\Zmy\\Desktop\\in.txt","r",stdin);
// freopen("C:\\Users\\Zmy\\Desktop\\out.txt","w",stdout);
#endif // ONLINE_JUDGE
full=1<<11;
rep(S,full)
if (judge(S))
ok[S]=1;
while(cin>>N>>M,N||M)
{
cle(dp,0);
full=1<<M; //初始化dp边界
rep(S,full)
if(ok[S])
dp[S][0]=1;
//求dp 1到 n-1
Rep(i,1,N-1)
{
rep(s,full)
{
rep(s1,full)
{
if (!judge2(s,s1)) continue;
dp[s][i]+=dp[s1][i-1];//只有在都是1的情况下才做+=操作
}
}
}
//输出全是1的情况,并且在n-1行
int s=(1<<M)-1;
printf("%I64d\n",dp[s][N-1]);
} return 0;
}
POJ 2411 Mondriaan'sDream(状压DP)的更多相关文章
- 状压DP POJ 2411 Mondriaan'sDream
题目传送门 /* 题意:一个h*w的矩阵(1<=h,w<=11),只能放1*2的模块,问完全覆盖的不同放发有多少种? 状态压缩DP第一道:dp[i][j] 代表第i行的j状态下的种数(状态 ...
- POJ 3254 Corn Fields (状压dp)
题目链接:http://poj.org/problem?id=3254 给你n*m的菜地,其中1是可以种菜的,而菜与菜之间不能相邻.问有多少种情况. 状压dp入门题,将可以种菜的状态用一个数的二进制表 ...
- POJ 3254 - Corn Fields - [状压DP水题]
题目链接:http://poj.org/problem?id=3254 Time Limit: 2000MS Memory Limit: 65536K Description Farmer John ...
- [ An Ac a Day ^_^ ] POJ 3254 Corn Fields 状压dp
题意: 有一块n*m的土地 0代表不肥沃不可以放牛 1代表肥沃可以放牛 且相邻的草地不能同时放牛 问最多有多少种放牛的方法并对1e8取模 思路: 典型的状压dp 能状态压缩 能状态转移 能状态压缩的题 ...
- poj 3254Corn Fields (入门状压dp)
Farmer John has purchased a lush ≤ M ≤ ; ≤ N ≤ ) square parcels. He wants to grow some yummy corn fo ...
- POJ 1684 Corn Fields(状压dp)
描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ ...
- POJ 2923 Relocation(状压DP)题解
题意:有2辆车运货,每次同时出发,n(<10),各自装货容量c1 c2,问最少运几次运完. 思路:n比较小,打表打出所有能运的组合方式,用背包求出是否能一次运走.然后状压DP运的顺序. 代码: ...
- POJ 2411 Mondriaan's Dream 插头dp
题目链接: http://poj.org/problem?id=2411 Mondriaan's Dream Time Limit: 3000MSMemory Limit: 65536K 问题描述 S ...
- poj 2411 Mondriaan's Dream 轮廓线dp
题目链接: http://poj.org/problem?id=2411 题目意思: 给一个n*m的矩形区域,将1*2和2*1的小矩形填满方格,问一共有多少种填法. 解题思路: 用轮廓线可以过. 对每 ...
随机推荐
- HZAU 17:LCS
17: LCS Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 184 Solved: 43[Submit][Status][Web Board] De ...
- Linux 命令ln
在linux中可用ln命令创建一个文件的链接(软链接或者硬链接) 硬链接的使用: root@IdeaPad:~# ln 2.txt e.txt root@IdeaPad:~# ls 1.txt 2.t ...
- poj1094 拓扑序
题意:现在有多个大写字母(不一定连续),给出字母之间的大小关系,问到第几个关系时就能判断有唯一大小排序或出现矛盾,或是有多个合理排序,若有唯一排序,则输出它. 拓扑序,只不过坑爹的是如果关系处理到一半 ...
- C++@语句块
#include <iostream> using namespace std; int main() { { int x=1; cout << x << endl ...
- javascript保留两位小数
原文地址http://blog.csdn.net/he20101020/article/details/8503308 <script type="text/javascrip ...
- Axure母版
1.生成母版: 在左侧窗口的最下方有母版管理窗口,可以在该管理窗口中直接新建母版.也可以在某个页面中将某些部件转换为母版.如图: ----------------------------------- ...
- mrtg
centos6.5-64-minimal http://oss.oetiker.ch/mrtg/doc/cfgmaker.en.htmlhttp://www.cnblogs.com/see7di/ar ...
- C#, float.ToString()的一个坑
下面代码的输出竟然是2.0: float a=1.95f;Debug.Log(a.ToString("0.0")); 如果想截取一位小数,可以: float a=1.95f; fl ...
- js防止回车(enter)键提交表单及javascript中event.keycode
如何防止回车(enter)键提交表单,其实很简单,就一句话.onkeydown="if(event.keyCode==13)return false;"把这句写在from标签里 ...
- java指针
import java.util.ArrayList; import java.util.List; public class TestPoint { public static void main( ...