ABC130 E問題:Common Subsequence

問題. Common Subsequence

長さ  N の整数列  S と長さ  M の整数列  T が与えられる. S T の等しい部分列が何通りあるか求めよ.

制約 1 \le N, M \le 2 \times 10^3,  S T の各要素は 1 以上  10^5 以下

解法.動的計画法

動的計画法で求める.dp[i][j] を連続部分列  S_1, S_2, \ldots, S_i T_1, T_2, \ldots, T_j の等しい部分列の数と定義する.このとき漸化式は,
 ・  S_i \neq T_j の場合: dp[i][j] += dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1]
 ・  S_i = T_j の場合: dp[i][j] += dp[i - 1][j] + dp[i][j - 1]
となる.ただし,dp[i][0]dp[0][j] の値は 1 に初期化をする(空の部分列).

上の漸化式は, S_i = T_j の場合は連続部分列  S_1, S_2, \ldots, S_{i - 1} T_1, T_2, \ldots, T_{j - 1} の等しい部分列の末尾に  S_i T_j をそれぞれ加えることによって新たな等しい部分列を構成することができることを表している.これは, S_i \neq T_j の場合に新たに構成される部分列の数 dp[i - 1][j - 1] を加えている.

計算時間 O(N M)

最長増加部分列のように動的計画法だろうなとなんとなくで漸化式を作ったら,なんとなくで通ったからダメすぎる(漸化式の意味付けは後出しジャンケン).
漸化式を考えるときの思考が上手くできていないのでどうにかしないと・・・.