码迷,mamicode.com
首页 > 其他好文 > 详细

牧场的安排

时间:2020-07-10 21:10:53      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:png   cout   nbsp   col   space   name   const   pre   进制   

牧场的安排

技术图片

 

 技术图片

 

 具体见代码:

 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 << \n;
46     return 0;
47 }

 

牧场的安排

标签:png   cout   nbsp   col   space   name   const   pre   进制   

原文地址:https://www.cnblogs.com/wsy107316/p/13280909.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!