notepad.exe

つまり覚え書き

ABC104 D - We Love ABC

解説を見ながら少しでもかみ砕こうとした記録

D - We Love ABC

ABC104 D - We Love ABC

全ての文字列のABC数の合計を求める問題

DPを使って解く
何らかの組み合わせの最大値や総数を10^{9} + 7で割った余りを求めるなどはDPを使う問題と連想できそう

今回の問題でのDPの考え方は「S の先頭から i − 1 文字目までに対する処理(? の置換と丸つけ)をすでに 行っていて、これまでに丸を j 個つけている場合の、S の残りの部分に対する処理を行う方法の個数」で、

  • j < 3で「次に丸を付けるべき文字or?」なら数え終わっている文字の次の文字に組み合わせの数を引き継ぐ
  • j = 3で「?」ならABCのどれでもいいので一つ前の組み合わせに3をかけるそうでなければ前の組み合わせを引き継ぐ

をDPすればよさそう

コード中の計算で

dp[i][j] = dp[i+1][j] * (s.charAt(i) == '?' ? 3L : 1L);

が3つ選び終わっていて今の対象の文字が「?」であればそれまでの組み合わせのすべてに「A, B, C」のいずれかをくっつけれるので3倍するところ。

if(j < 3 && (s.charAt(i) == '?' || s.charAt(i) == "ABC".charAt(j))) {
    dp[i][j] += dp[i+1][j+1];
}

ここが例えば2個つけていたら対象の文字が「A」または「?」のようにABC数を作れるかどうかで加算しているところ。

提出コード(写経しただけ)