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: