牧场的安排
具体见代码:
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 }