AtCoder Beginner Contest 189 D - Logical Expression【Python】

https://atcoder.jp/contests/abc189/tasks/abc189_d

AtCoder ProblemsでDifficulty: 769、Solve Probability: 32%でした。

動的計画法で解くことができましたが、思いつくのと実装に時間がかかってしまいました。
最近のABCでも桁DPなるもので解ける問題が出ていることもあるため、動的計画法全般について慣れていきたいです。

N = int(input())
S = []
for i in range(N):
    s = input()
    S.append(s)

# dp[i][j]: 文字列Siまで見たときの状態がj(False or True)のときの数
dp = [[0] * 2 for _ in range(N + 1)]
dp[0] = [1, 1]
for i in range(1, N+1):
    if S[i-1] == "AND":
        # F∧T, F∧F, T∧F(1つ前のFからの遷移が2つ、1つ前のTからの遷移が1つ)
        dp[i][0] += dp[i-1][0] * 2 + dp[i-1][1]
        # T∧T(1つ前のTからの遷移が1つ)
        dp[i][1] += dp[i-1][1]
    else:
        # F∨F(1つ前のFからの遷移が1つ)
        dp[i][0] += dp[i-1][0]
        # F∨T, T∨F, T∨T(1つ前のFからの遷移が1つ、1つ前のTからの遷移が2つ)
        dp[i][1] += dp[i-1][0] + dp[i-1][1] * 2

print(dp[N][1])