POJ 2411 状态压缩递,覆盖方案数

无非就是横着放与竖着放,状态中用1表示覆盖,0表示未覆盖。

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 #include <string>
 5 #include <string.h>
 6 #include <stdio.h>
 7 #include <queue>
 8 #include <stack>
 9 #include <map>
10 #include <set>
11 #include <cmath>
12 #include <ctime>
13 #include <cassert>
14 #include <sstream>
15 using namespace std;
16
17 const int N=13;
18
19 long long dp[N][1<<N];
20
21 int h,w;
22 int row;
23 void dfs(int col,int pre,int cur) {
24     if (col>=w) {
25         dp[row][cur]+=dp[row-1][pre];
26         return;
27     }
28     if (col+1<=w) {
29         dfs(col+1,pre<<1|1,cur<<1); // 当前不放竖骨牌
30         dfs(col+1,pre<<1,cur<<1|1); // 放竖骨牌将本行与上行此列覆盖
31     }
32     if (col+2<=w) {
33         dfs(col+2,pre<<2|3,cur<<2|3); // 横放骨牌
34     }
35 }
36 int main () {
37     while (scanf("%d %d",&h,&w)!=EOF,h+w) {
38         if ((h*w)&1) {
39             puts("0");
40             continue;
41         }
42         if (h<w) swap(h,w); // 优化复杂度
43         memset(dp,0,sizeof dp);
44         dp[0][(1<<w)-1]=1;
45         for (row=1;row<=h;row++) {
46             dfs(0,0,0);
47         }
48         printf("%lld\n",dp[h][(1<<w)-1]);
49     }
50     return 0;
51 }
时间: 2024-10-12 15:26:38

POJ 2411 状态压缩递,覆盖方案数的相关文章

Mondriaan&#39;s Dream(POJ 2411状态压缩dp)

题意:用1*2的方格填充m*n的方格不能重叠,问有多少种填充方法 分析:dp[i][j]表示i行状态为j时的方案数,对于j,0表示该列竖放(影响下一行的该列),1表示横放成功(影响下一列)或上一列竖放成功.状态转移时,枚举每一行可能的状态上一行取反得下一行能放的状态. #include <map> #include <set> #include <list> #include <cmath> #include <queue> #include &

poj 3254 状态压缩

Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15285   Accepted: 8033 Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parcels. He wants to grow some yum

POJ 3311 状态压缩DP

题意:求从0点走到所有点又走回来的最短距离 该题又很多做法,我用的是弗洛伊德+状态压缩 先遍历所有点,求出两点间最短的距离,而后用状态压缩表示该点是否走过,(1<<n)-1则表示所有点都走过. 附AC代码 #include<stdio.h> #include<string.h> int map[12][12]; int dp[(1<<12)+1][12]; int min1(int a,int b) { if(a<b) return a; return

poj 1324 状态压缩+bfs

http://poj.org/problem?id=1324 Holedox Moving Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 17042   Accepted: 4065 Description During winter, the most hungry and severe time, Holedox sleeps in its lair. When spring comes, Holedox wakes

poj 1185 状态压缩

炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 27926   Accepted: 10805 Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图.在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队):一支炮兵部队在地图上的攻

POJ 1185(状态压缩原来还可以这样)

吐槽一下,刚做完两个状压的题,想着是一样的思路.没想到被坑了 有点类似于图论题目中不用邻接矩阵而用存储点将数据规模从输入范围->输入量 刚开始看题以为是攻击范围也不能重合,于是就是考虑到4次的范围.然后就是i-1,j-2两行如何组合而成. 果断TLE,如果用dp[maxn][1<<10][1<<10],MLE,TLE. 其实换个思路,10个方格的组合情况其实至多就只有60种,可以换成存储个数. 不吐槽了,贴一个代码.懒得自己写了. #include <iostream&

poj 3250 状态压缩dp入门

Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7798   Accepted: 4159 Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parcels. He wants to grow some yumm

poj 2688 状态压缩dp解tsp

题意: 裸的tsp. 分析: 用bfs求出任意两点之间的距离后可以暴搜也可以用next_permutation水,但效率肯定不如状压dp.dp[s][u]表示从0出发访问过s集合中的点,目前在点u走过的最短路程. 代码: //poj 2688 //sep9 #include <iostream> #include <queue> using namespace std; const int maxW=32; const int maxN=12; int dx[4]={-1,1,0,

poj 2411 Mondriaan&#39;s Dream(状态压缩+dp)

 题意:用1*2砖块铺满n*m的房间. 思路转自:http://www.cnblogs.com/scau20110726/archive/2013/03/14/2960448.html 因为这道题输入范围在11*11之间,所以可以先打表直接输出.......... 状态压缩DP 经典覆盖问题,输入n和m表示一个n*m的矩形,用1*2的方块进行覆盖,不能重叠,不能越出矩形边界,问完全覆盖完整个矩形有多少种不同的方案 其中n和m均为奇数的话,矩形面积就是奇数,可知是不可能完全覆盖的.接着我们来看