POJ 1185 炮兵阵地,位DP.....
搞不懂为什么使用全局变量还比传递参数慢几十MS...也搞不懂传递参数为什么会比每次算一次1的个数慢几十MS...
教训:位运算一定一定要多加括号
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
1 #include <iostream>
2 #define BIT(x, i) ((x >> i)&1)
3 #define ORBIT(i) (1 << i)
4 using namespace std;
5
6 int hill[105];
7 int curr[60][60], next[60][60];
8 int state[105][60], cnt[105], num[105][60];
9 int n, m, ans;
10 char c[11];
11
12 int calt(int x)
13 {
14 int i = 0;
15 while (x)
16 x &= (x - 1), i++;
17 return i;
18 }
19
20 void dfs(int i, int j, int k, int x)
21 {
22 if (x >= m)
23 {
24 num[k][cnt[k]] = calt(i);
25 state[k][cnt[k]++] = i;
26 return;
27 }
28 if (!BIT(j, x))
29 dfs(i | ORBIT(x), j, k, x + 3);
30 dfs(i, j, k, x + 1);
31 }
32
33 int main()
34 {
35 //freopen("test.in", "r", stdin);
36 while (scanf("%d%d", &n, &m) != EOF)
37 {
38 memset(hill, 0, sizeof (hill));
39 for (int i = 0; i < n; i++)
40 {
41 scanf("%s", c);
42 for (int j = 0; j < m; j++)
43 if (c[j] == 'H')
44 hill[i] |= (1 << j);
45 }
46
47 // pre calculate
48 memset(num, 0, sizeof (num));
49 memset(cnt, 0, sizeof (cnt));
50 for (int i = 0; i < n; i++)
51 dfs(0, hill[i], i, 0);
52
53 ans = 0;
54 for (int i = 0; i < cnt[0]; i++)
55 ans = max(ans, num[0][i]);
56
57 memset(curr, 0, sizeof (curr));
58 for (int i = 0; i < cnt[0]; i++)
59 for (int j = 0; j < cnt[1]; j++)
60 if ((state[0][i] & state[1][j]) == 0)
61 curr[i][j] = max(curr[i][j], num[0][i] + num[1][j]);
62
63 for (int y = 2; y < n; y++)
64 {
65 memset(next, 0, sizeof (next));
66 for (int i = 0; i < cnt[y - 2]; i++)
67 for (int j = 0; j < cnt[y - 1]; j++)
68 if ((state[y - 2][i] & state[y - 1][j]) == 0)
69 for (int k = 0; k < cnt[y]; k++)
70 if ((state[y - 2][i] & state[y][k]) == 0 && (state[y - 1][j] & state[y][k]) == 0)
71 next[j][k] = max(next[j][k], curr[i][j] + num[y][k]);
72 memcpy(curr, next, sizeof (curr));
73 }
74
75 for (int i = 0; i < cnt[n - 2]; i++)
76 for (int j = 0; j < cnt[n - 1]; j++)
77 ans = max(ans, curr[i][j]);
78 printf("%d\n", ans);
79 }
80 return 0;
81