zoukankan      html  css  js  c++  java
  • 【bzoj1725】[USACO2006 Nov]Corn Fields牧场的安排 状态压缩dp

    题目描述

    Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地。FJ打算在牧场上的某几格土地里种上美味的草,供他的奶牛们享用。遗憾的是,有些土地相当的贫瘠,不能用来放牧。并且,奶牛们喜欢独占一块草地的感觉,于是FJ不会选择两块相邻的土地,也就是说,没有哪两块草地有公共边。当然,FJ还没有决定在哪些土地上种草。 作为一个好奇的农场主,FJ想知道,如果不考虑草地的总块数,那么,一共有多少种种植方案可供他选择。当然,把新的牧场荒废,不在任何土地上种草,也算一种方案。请你帮FJ算一下这个总方案数。

    输入

    * 第1行: 两个正整数M和N,用空格隔开

    * 第2..M+1行: 每行包含N个用空格隔开的整数,描述了每块土地的状态。输入的第i+1行描述了第i行的土地。所有整数均为0或1,是1的话,表示这块土地足够肥沃,0则表示这块地上不适合种草

    输出

    * 第1行: 输出一个整数,即牧场分配总方案数除以100,000,000的余数

    例输入

    2 3
    1 1 1
    0 1 0

    样例输出

    9


     题解

    裸的状态压缩dp,不需要任何优化

    f[i][j]表示第i行状态为j时的方案数。

    #include <cstdio>
    #include <algorithm>
    #define MOD 100000000
    using namespace std;
    int f[13][4100] , no[13];
    int main()
    {
        int m , n , i , j , k , t , ans = 0;
        scanf("%d%d" , &m , &n);
        for(i = 1 ; i <= m ; i ++ )
            for(j = 1 ; j <= n ; j ++ )
                if(scanf("%d" , &t) && !t)
                    no[i] |= 1 << (j - 1);
        no[0] = (1 << n) - 1;
        f[0][0] = 1;
        for(i = 1 ; i <= m ; i ++ )
            for(j = 0 ; j < 1 << n ; j ++ )
                if(!(no[i] & j) && !(j & (j << 1)))
                    for(k = 0 ; k < 1 << n ; k ++ )
                        if(!(no[i - 1] & k) && !(k & (k << 1)) && !(j & k))
                            f[i][j] = (f[i][j] + f[i - 1][k]) % MOD;
        for(i = 0 ; i < 1 << n ; i ++ )
            ans = (ans + f[m][i]) % MOD;
        printf("%d
    " , ans);
        return 0;
    }
  • 相关阅读:
    Codeforces Round #172 (Div. 2) B. Nearest Fraction
    什么是DWR
    1310 N皇后问题
    ural Bus Routes(dfs深搜)
    ural Russian Pipelines(最短路)
    ural Graph Decomposition
    ural Network ( 最小生成树)
    poj 1579 Function Run Fun ( 记忆化搜索 )
    计算某一天的前一天的日期
    DataStructGraphpart1
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/6208818.html
Copyright © 2011-2022 走看看