main.cc 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include <algorithm>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5. const int N = 100;
  6. const int M = 10;
  7. const int S = 60;
  8. char row[M + 1]; // Stores each row of map
  9. int map[N]; // Bitmap of each row, 1 stands for hill
  10. int st[S], s; // All valid state
  11. 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
  12. int n, m;
  13. void init_state() {
  14. s = 0;
  15. for (int i = 0; i < 1 << m; i++) {
  16. if ((i << 1) & i || (i << 2) & i) continue;
  17. st[s++] = i;
  18. }
  19. }
  20. int ones(int i) {
  21. int cnt = 0;
  22. for (; i != 0; i >>= 1) i & 1 && cnt++;
  23. return cnt;
  24. }
  25. int main() {
  26. scanf("%d %d", &n, &m);
  27. memset(map, 0, sizeof(map));
  28. for (int i = 0; i < n; i++) {
  29. scanf("%s", row);
  30. for (int j = 0; j < m; j++) {
  31. map[i] <<= 1;
  32. if (row[j] == 'H') map[i] |= 1;
  33. }
  34. }
  35. init_state();
  36. memset(dp, 0xFF, sizeof(dp));
  37. for (int i = 0; i < s; i++) // Init dp[0][][]
  38. if ((map[0] & st[i]) == 0) dp[0][i][0] = ones(st[i]);
  39. for (int i = 0; i < s; i++) { // Init dp[1][][]
  40. if ((map[1] & st[i]) != 0) continue;
  41. for (int j = 0; j < s; j++) {
  42. if ((st[i] & st[j]) != 0 || dp[0][j][0] == -1) continue;
  43. dp[1][i][j] = max(dp[1][i][j], dp[0][j][0] + ones(st[i]));
  44. }
  45. }
  46. for (int i = 2; i < n; i++) {
  47. for (int j = 0; j < s; j++) {
  48. if ((map[i] & st[j]) != 0) continue;
  49. for (int k = 0; k < s; k++) {
  50. if ((st[j] & st[k]) != 0) continue;
  51. for (int l = 0; l < s; l++) {
  52. if ((st[j] & st[l]) != 0 || dp[i - 1][k][l] == -1) continue;
  53. dp[i][j][k] = max(dp[i][j][k], dp[i - 1][k][l] + ones(st[j]));
  54. }
  55. }
  56. }
  57. }
  58. int ans = 0;
  59. for (int i = 0; i < n; i++)
  60. for (int j = 0; j < s; j++)
  61. for (int k = 0; k < s; k++) ans = max(ans, dp[i][j][k]);
  62. printf("%d\n", ans);
  63. return 0;
  64. }