入力の大きさを見て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; } };