入力の大きさを見てDPを捨てる。
H-1行目を埋める段階では、H-2行目が確定している。下から上へ見て行って良い気がする。
とりあえず逆から見ていったらサンプルが合う。通る。
class AlgridTwo {
public:
int makeProgram(vector <string> t)
{
const lli mod = 1000000007;
const int H = t.size();
const int W = t[0].size();
for (int i = H - 2; 0 <= i; --i) {
for (int j = W - 2; 0 <= j; --j) {
// cout << i << ' ' << j << endl;
char& A = t[i][j];
char& B = t[i][j + 1];
char& C = t[i + 1][j];
char& D = t[i + 1][j + 1];
if (false) {
} else if (A == 'W' && B == 'W') { // nothing
} else if (A == 'B' && B == 'B') { // swap
swap(C, D);
} else if (A == 'B' && B == 'W') { // BB
if (C == 'W' || D == 'W') return 0;
C = D = '@';
} else if (A == 'W' && B == 'B') { // WW
if (C == 'B' || D == 'B') return 0;
C = D = '@';
} else ;
}
}
int cnt = 0;
for (int i = 0; i < t.size(); ++i) {
cnt += count(t[i].begin(), t[i].end(), '@');
}
lli ret = 1;
for (int i = 0; i < cnt; ++i) {
ret = (ret * 2) % mod;
}
return ret;
}
};