Official

D - Flip Cards Editorial by kyopro_friends


1枚目から順に表裏を決めることを考えます。\(i\) 枚目のカードを表/裏にしてよいかどうかは、\(i-1\) 枚目のカードを表/裏にしたかどうかのみに依存します。そこで次のようなDPを考えます。

\({\rm DP}[i][{\rm flag}] =\) \(i\) 枚目のカードまでの表裏の決め方のうち、条件を満たし、\(i\) 枚目のカードが ( \({\rm flag}\) ? 表 : 裏) であるような方法の数

このDPは状態数 \(O(N)\)、遷移 \(O(1)\) であることから、\(O(N)\) で答えを求めることができます。

実装例(Python)

MOD=998244353

N=int(input())
data=[tuple(map(int,input().split())) for _ in range(N)]
dp=[[0,0] for _ in range(N)]
dp[0]=[1,1]
for i in range(1,N):
  # 配るDP
  for pre in range(2):
    for nxt in range(2):
      if data[i-1][pre]!=data[i][nxt]:
        dp[i][nxt]+=dp[i-1][pre]
  dp[i][0]%=MOD
  dp[i][1]%=MOD

print((dp[N-1][0]+dp[N-1][1])%MOD)

posted:
last update: