zoukankan      html  css  js  c++  java
  • [POJ3254]Corn Fields(状压DP)

    题目链接:http://poj.org/problem?id=3254

    给n*m的格子图,图上有地方有草有地方没草,FJ希望把牛放到有草的地方,但是上下左右不能有相邻的牛在一起。问有多少中分配方式,结果对100000000取模。

    状压DP,设dp(i,j)为第i行时状态j,由于m<=12所以只需要12个二进制位来表示当前行是如何占用的即可。

    用一个一位数组存图的状态,初始化的时候枚举第一行,遇到这一行没有相邻1出现并且这个状态都是草地的情况,可以把这个状态初始化为1。

    接下来枚举2~n行i,和i行的j个状态(有1<<m个)。如果不满足:1、这一行没有相邻1出现。2、这个状态都是草地,则这个状态下方案数为0。否则,枚举前一行的状态k,查看i-1行的状态k是否可以转移到i行的状态j。如果可以的话就累加取模。

      1 /*
      2 ━━━━━┒ギリギリ♂ eye!
      3 ┓┏┓┏┓┃キリキリ♂ mind!
      4 ┛┗┛┗┛┃\○/
      5 ┓┏┓┏┓┃ /
      6 ┛┗┛┗┛┃ノ)
      7 ┓┏┓┏┓┃
      8 ┛┗┛┗┛┃
      9 ┓┏┓┏┓┃
     10 ┛┗┛┗┛┃
     11 ┓┏┓┏┓┃
     12 ┛┗┛┗┛┃
     13 ┓┏┓┏┓┃
     14 ┃┃┃┃┃┃
     15 ┻┻┻┻┻┻
     16 */
     17 #include <algorithm>
     18 #include <iostream>
     19 #include <iomanip>
     20 #include <cstring>
     21 #include <climits>
     22 #include <complex>
     23 #include <fstream>
     24 #include <cassert>
     25 #include <cstdio>
     26 #include <bitset>
     27 #include <vector>
     28 #include <deque>
     29 #include <queue>
     30 #include <stack>
     31 #include <ctime>
     32 #include <set>
     33 #include <map>
     34 #include <cmath>
     35 using namespace std;
     36 #define fr first
     37 #define sc second
     38 #define cl clear
     39 #define BUG puts("here!!!")
     40 #define W(a) while(a--)
     41 #define pb(a) push_back(a)
     42 #define Rint(a) scanf("%d", &a)
     43 #define Rll(a) scanf("%I64d", &a)
     44 #define Rs(a) scanf("%s", a)
     45 #define Cin(a) cin >> a
     46 #define FRead() freopen("in", "r", stdin)
     47 #define FWrite() freopen("out", "w", stdout)
     48 #define Rep(i, len) for(int i = 0; i < (len); i++)
     49 #define For(i, a, len) for(int i = (a); i < (len); i++)
     50 #define Cls(a) memset((a), 0, sizeof(a))
     51 #define Clr(a, x) memset((a), (x), sizeof(a))
     52 #define Full(a) memset((a), 0x7f7f7f, sizeof(a))
     53 #define lrt rt << 1
     54 #define rrt rt << 1 | 1
     55 #define pi 3.14159265359
     56 #define RT return
     57 #define lowbit(x) x & (-x)
     58 #define onecnt(x) __builtin_popcount(x)
     59 typedef long long LL;
     60 typedef long double LD;
     61 typedef unsigned long long ULL;
     62 typedef pair<int, int> pii;
     63 typedef pair<string, int> psi;
     64 typedef pair<LL, LL> pll;
     65 typedef map<string, int> msi;
     66 typedef vector<int> vi;
     67 typedef vector<LL> vl;
     68 typedef vector<vl> vvl;
     69 typedef vector<bool> vb;
     70 
     71 const int mod = 100000000;
     72 const int maxn = 15;
     73 const int maxm = 1 << maxn;
     74 int G[maxn];
     75 int dp[maxn][maxm];
     76 int n, m, mm;
     77 
     78 bool ok(int x, int y) {
     79     if((G[x] & y) != y) return 0;
     80     if(((y << 1) & y) != 0) return 0;
     81     return 1;
     82 }
     83 
     84 int main() {
     85     // FRead();
     86     int x;
     87     while(~Rint(n) && ~Rint(m)) {
     88         Cls(G); Cls(dp);
     89         mm = 1 << m;
     90         For(i, 1, n+1) {
     91             Rep(j, m) {
     92                 Rint(x);
     93                 G[i] <<= 1;
     94                 G[i] |= x;
     95             }
     96         }
     97         Rep(j, mm) if(ok(1, j)) dp[1][j] = 1;
     98         For(i, 2, n+1) {
     99             Rep(j, mm) {
    100                 if(!ok(i, j)) continue;
    101                 Rep(k, mm) {
    102                     if(j & k) continue;
    103                     dp[i][j] = (dp[i][j] + dp[i-1][k]) % mod;
    104                 }
    105             }
    106         }
    107         int ret = 0;
    108         Rep(i, mm) ret = (ret + dp[n][i]) % mod;
    109         printf("%d
    ", ret);
    110     }
    111     RT 0;
    112 }
  • 相关阅读:
    洛谷 P1226 【模板】快速幂||取余运算 题解
    洛谷 P2678 跳石头 题解
    洛谷 P2615 神奇的幻方 题解
    洛谷 P1083 借教室 题解
    洛谷 P1076 寻宝 题解
    洛谷 UVA10298 Power Strings 题解
    洛谷 P3375 【模板】KMP字符串匹配 题解
    Kafka Shell基本命令
    Mybatis与Hibernate的详细对比
    MyBatis简介
  • 原文地址:https://www.cnblogs.com/kirai/p/5788334.html
Copyright © 2011-2022 走看看