zoukankan      html  css  js  c++  java
  • 牧场的安排

    牧场的安排

     

     具体见代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const int mod = 1e8;
     5 
     6 // dp[i][j]:第i行,第j种状态的方案数
     7 int n, m;
     8 int a[15][15], dp[15][(1 << 12) + 5];
     9 ll f[15], maxx, ans;
    10 bool flag[(1 << 12) + 5];
    11 
    12 int main() {
    13     cin >> m >> n;
    14     for (int i = 1; i <= m; i++) {
    15         for (int j = 1; j <= n; j++) {
    16             cin >> a[i][j];
    17             f[i] = (f[i] << 1) + a[i][j];  //把状态转化成一个十进制数
    18         }
    19     }
    20     maxx = (1 << n) - 1;  //一行最多的情况:e.g.有5列,则00000~11111
    21     for (int i = 0; i <= maxx; i++) {
    22         if ((((i << 1) & i) == 0) &&
    23             (((i >> 1) & i) == 0)) {  //如果此位的前一位没放,且后一位没放,那么此位就可以放
    24             flag[i] = 1;              //表示一行的i状态摆放方式可行
    25         }
    26     }
    27 
    28     for (int i = 0; i <= maxx; i++) {
    29         if (flag[i] == 1 && ((i & f[1]) == i))  // i方式合理,且第一行的可以放成i方式
    30             dp[1][i] = 1;                       //则这种方式有一个了
    31     }
    32 
    33     for (int i = 2; i <= m; i++) {
    34         for (int j = 0; j <= maxx; j++) {
    35             if (flag[j] == 1 && ((j & f[i]) == j)) {
    36                 for (int k = 0; k <= maxx; k++) {
    37                     if ((j & k) == 0)
    38                         dp[i][j] = (dp[i][j] + dp[i - 1][k]) % mod;
    39                 }
    40             }
    41         }
    42     }
    43 
    44     for (int i = 0; i <= maxx; i++) ans = (ans + dp[m][i]) % mod;
    45     cout << ans << '
    ';
    46     return 0;
    47 }
  • 相关阅读:
    jeecg多页签的选择切换
    设计模式:工厂三姐妹一网打尽
    设计模式:工厂三姐妹一网打尽
    设计模式:工厂三姐妹一网打尽
    设计模式:工厂三姐妹一网打尽
    三、原子操作
    三、原子操作
    三、原子操作
    三、原子操作
    WebClient HttpWebRequest从网页中获取请求数据
  • 原文地址:https://www.cnblogs.com/wsy107316/p/13280909.html
Copyright © 2011-2022 走看看