제출 #52162

#제출 시각아이디문제언어결과실행 시간메모리
52162WLZDango Maker (JOI18_dango_maker)C++17
100 / 100
831 ms111716 KiB
#include <iostream>
#include <vector>

using namespace std;

int h, w;
vector<string> s;

int solve(int y, int x) {
  vector<int> v;
  for (int k = 0; y - k >= 0 && x + k < w; k++) {
    int i = y - k;
    int j = x + k;
    if (s[i][j] != 'G') {
      v.push_back(0);
      continue;
    }
    int a = 0;
    if (j > 0 && j + 1 < w && s[i][j - 1] == 'R' && s[i][j + 1] == 'W') {
      a++;
    }
    if (i > 0 && i + 1 < h && s[i - 1][j] == 'R' && s[i + 1][j] == 'W') {
      a += 2;
    }
    v.push_back(a);
  }
  vector<vector<int>> dp((int) v.size() + 1, vector<int>(2, 0));
  for (int i = 0; i < (int) v.size(); i++) {
    for (int j = 0; j < 2; j++) {
      for (int k = 0; k < 2; k++) {
        int tmp = dp[i][j];
        if ((v[i] >> k & 1) && j == k) {
          tmp++;
        }
        dp[i + 1][k] = max(dp[i + 1][k], tmp);
      }
    }
  }
  return max(dp[(int) v.size()][0], dp[(int) v.size()][1]);
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> h >> w;
  s = vector<string>(h);
  for (int i = 0; i < h; i++) {
    cin >> s[i];
  }
  int ans = 0;
  for (int i = 0; i < h; i++) {
    ans += solve(i, 0);
  }
  for (int i = 1; i < w; i++) {
    ans += solve(h - 1, i);
  }
  cout << ans << '\n';
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...