horoyoisawaのゴミ箱

いろいろ書きます

AtCoder Beginner Contest 122 D - We Like AGC 誤答コード

問題と提出コードはこちら。

問題

atcoder.jp

提出コード
#include <bits/stdc++.h>
using namespace std;
using P = pair<int, int>;
using ll = long long;
#define chmin(i, j) i = min(i, j);
#define chmax(i, j) i = max(i, j);
#define rep(i, n) for(int i=0;i<n;i++)
ll N;
ll MOD = 1000000007;
vector<map<string, ll>> memo;
bool ok(string last4) {
  rep(i, 4) {
    string t = last4;
    if(i >= 1) swap(t[i], t[i-1]);
    auto it = t.find("AGC");
    if(it != string::npos) return false;
  }
  return true;
}

ll dfs(int cur, string last3) {
  if(memo[cur][last3]) return memo[cur][last3];
  if(cur == N) return 1;
  ll ret = 0;
  for(auto& c : "ACGT") {
    if(ok(last3 + c)) {
      ret += dfs(cur+1, last3.substr(1, 2) + c);
      ret %= MOD;
    }
  }
  memo[cur][last3] = ret;
  return ret;
}
int main() {
  cin >> N;
  memo.resize(N+1);
  cout << dfs(0, "TTT") << endl;
}

正直全くわからなkった。解答に忠実に実装したがWA。最初のサンプル入力における出力は122。期待される値は61。

わかったら追記する。

追記用