zoukankan      html  css  js  c++  java
  • 算法竞赛进阶指南 玉米田 题解

    题目大意


     

    农夫约翰的土地由 M×个小方格组成,现在他要在土地里种植玉米。

    非常遗憾,部分土地是不育的,无法种植。

    而且,相邻的土地不能同时种植玉米,也就是说种植玉米的所有方格之间都不会有公共边缘。

    现在给定土地的大小,请你求出共有多少种种植方法。

    土地上什么都不种也算一种方法。

    输出总种植方法对 108 取模后的值。其中1M,N12

    题解


     

    想了两分钟,和四川省选那道题几乎是一模一样的思路,状态的话由于没有种的个数限制所以少了一维,反而更简单了

    要注意的就是对于不能种的田的小技巧,由于与运算的特殊性质,我们一开始就计算好每一行的二进制数

    (并且1表示不能种,方便后面与预处理的状态进行与运算)

     

    程序


    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    
    using namespace std;
    
    const int N  = 14,M = 1 << 12,mod = 1e8;
    
    int f[N][M];
    vector<int> head[M];
    vector<int> state;
    int n,m;
    
    int g[N];
    
    inline bool check(int state)
    {
        for(int i = 0; i < m - 1; ++ i)
            if((state >> i & 1) && (state >> i + 1 & 1)) return false;
        return true;
    }
    
    
    int main()
    {
        cin >> n >> m;
        for(int i = 1; i <= n; ++ i)
         for(int j = 0;j < m; ++ j)
          {
              int t;
              cin >> t;
              g[i] += !t * (1 << j);
          }
          
          
        for(int i = 0; i < 1 << m; ++ i)
          if(check(i)) state.push_back(i);
          
        for (int i = 0; i < state.size(); i ++ )
            for (int j = 0; j < state.size(); j ++ )
            {
                int a = state[i], b = state[j];
                if (!(a & b))
                    head[i].push_back(j);
            }
          
        f[0][0] = 1;
        for (int i = 1; i <= n + 1; i ++ )
            for (int j = 0; j < state.size(); j ++ )
                if (!(state[j] & g[i]))
                    for (int k : head[j])
                        f[i][j] = (f[i][j] + f[i - 1][k]) % mod;
                   
               
        cout << f[n + 1][0] << endl;
        return 0;
               
        
    }
  • 相关阅读:
    百马百担
    穷举
    折叠次数
    判断年份是否是闰年
    定义xy比大小
    1月21日
    1月20日作业-第三题
    1月20日作业-第二题
    1月18日
    1月18日
  • 原文地址:https://www.cnblogs.com/yjyl0098/p/14630502.html
Copyright © 2011-2022 走看看