Ver Fonte

uppdate

dengxinyi há 6 anos atrás
pai
commit
67d0ed2c2d
1 ficheiros alterados com 71 adições e 0 exclusões
  1. 71 0
      poj/1185.artillery-position/main.cc

+ 71 - 0
poj/1185.artillery-position/main.cc

@@ -0,0 +1,71 @@
+#include <algorithm>
+#include <cstdio>
+#include <cstring>
+
+using namespace std;
+
+const int N = 100;
+const int M = 10;
+const int S = 60;
+
+char row[M + 1];
+int map[N]; // Bitmap of each row, 1 stands for hill
+int st[S], s; // All valid state
+int dp[N][S][S]; // dp[i][j][k] means max cnt at row i, when row i at state j and row i-1 at state k
+
+int n, m;
+
+void init_state() {
+  s = 0;
+  for (int i = 0; i < 1 << m; i++) {
+    if ((i << 1) & i || (i << 2) & i) continue;
+    st[s++] = i;
+  }
+}
+
+int ones(int i) {
+  int cnt = 0;
+  for (; i != 0; i >>= 1) i & 1 && cnt++;
+  return cnt;
+}
+
+int main() {
+  scanf("%d %d", &n, &m);
+  memset(map, 0, sizeof(map));
+  for (int i = 0; i < n; i++) {
+    scanf("%s", row);
+    for (int j = 0; j < m; j++) {
+      map[i] <<= 1;
+      if (row[j] == 'H') map[i] |= 1;
+    }
+  }
+  init_state();
+  memset(dp, 0xFF, sizeof(dp));
+  for (int i = 0; i < s; i++) // Init dp[0][][]
+    if ((map[0] & st[i]) == 0) dp[0][i][0] = ones(st[i]);
+  for (int i = 0; i < s; i++) { // Init dp[1][][]
+    if ((map[1] & st[i]) != 0) continue;
+    for (int j = 0; j < s; j++) {
+      if ((st[i] & st[j]) != 0 || dp[0][j][0] == -1) continue;
+      dp[1][i][j] = max(dp[1][i][j], dp[0][j][0] + ones(st[i]));
+    }
+  }
+  for (int i = 2; i < n; i++) {
+    for (int j = 0; j < s; j++) {
+      if ((map[i] & st[j]) != 0) continue;
+      for (int k = 0; k < s; k++) {
+        if ((st[j] & st[k]) != 0) continue;
+        for (int l = 0; l < s; l++) {
+          if ((st[j] & st[l]) != 0 || dp[i - 1][k][l] == -1) continue;
+          dp[i][j][k] = max(dp[i][j][k], dp[i - 1][k][l] + ones(st[j]));
+        }
+      }
+    }
+  }
+  int ans = 0;
+  for (int i = 0; i < n; i++)
+    for (int j = 0; j < s; j++)
+      for (int k = 0; k < s; k++) ans = max(ans, dp[i][j][k]);
+  printf("%d\n", ans);
+  return 0;
+}