牧场的安排

牧场的安排

 

 具体见代码:

 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 }
原文地址:https://www.cnblogs.com/wsy107316/p/13280909.html