1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| #include <bits/stdc++.h>
#ifdef ORZXKR #include <debug.h> #else #define debug(...) 1 #endif
#define file(s) freopen(s".in", "r", stdin), freopen(s".out", "w", stdout)
using namespace std;
int read() { int x = 0, f = 0; char ch = getchar(); while (ch < '0' || ch > '9') f |= ch == '-', ch = getchar(); while (ch >= '0' && ch <= '9') x = (x * 10) + (ch ^ 48), ch = getchar(); return f ? -x : x; }
const int kMaxN = 3005;
int n, m, ans; int f[kMaxN][3]; char s[kMaxN][kMaxN];
int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= n; ++i) { scanf("%s", s[i] + 1); } for (int sm = 2; sm <= n + m; ++sm) { memset(f, 0, sizeof(f)); int tmp = 0; for (int i = max(1, sm - m), j = sm - i; i <= n && j; ++i, --j) { f[i][0] = max({f[i - 1][0], f[i - 1][1], f[i - 1][2]}); if (s[i][j] == 'G') { if (s[i - 1][j] == 'R' && s[i + 1][j] == 'W') f[i][1] = max(f[i][1], max(f[i - 1][0], f[i - 1][1]) + 1); if (s[i][j - 1] == 'R' && s[i][j + 1] == 'W') f[i][2] = max(f[i][2], max(f[i - 1][0], f[i - 1][2]) + 1); } tmp = max(tmp, max({f[i][0], f[i][1], f[i][2]})); } ans += tmp; } printf("%d\n", ans); return 0; }
|