F. Fibonacci String Subsequences
设DP状态dp[i][j][k]
表示对于字符串F(i)与给出的字符串s[j...k]
这一段进行匹配的个数
有两种形式的转移方程:
1.s[j...k]
完全由f(i-1)
或者f(i-2)
提供
完全由f(i-1)
提供:
k=n
:
d
p
[
i
]
[
j
]
[
k
]
=
d
p
[
i
−
1
]
[
j
]
[
k
]
⋅
2
l
e
n
[
i
−
2
]
dp[i][j][k]=dp[i-1][j][k] \cdot 2^{len[i-2]}
dp[i][j][k]=dp[i−1][j][k]⋅2len[i−2]
k!=n
:
d
p
[
i
]
[
j
]
[
k
]
=
d
p
[
i
−
1
]
[
j
]
[
k
]
dp[i][j][k]=dp[i-1][j][k]
dp[i][j][k]=dp[i−1][j][k]
完全由f(i-2)
提供:
j=1
:
d
p
[
i
]
[
j
]
[
k
]
=
d
p
[
i
−
2
]
[
j
]
[
k
]
⋅
2
l
e
n
[
i
−
1
]
dp[i][j][k]=dp[i-2][j][k] \cdot 2^{len[i-1]}
dp[i][j][k]=dp[i−2][j][k]⋅2len[i−1]
j!=1
:
d
p
[
i
]
[
j
]
[
k
]
=
d
p
[
i
−
2
]
[
j
]
[
k
]
dp[i][j][k]=dp[i-2][j][k]
dp[i][j][k]=dp[i−2][j][k]
2.s[j...mid]
由f(i-1)
提供,s[(mid+1)...k]
由f(i-2)
提供
d
p
[
i
]
[
j
]
[
k
]
=
∑
m
i
d
=
j
k
−
1
d
p
[
i
−
1
]
[
j
]
[
m
i
d
]
⋅
d
p
[
i
−
2
]
[
m
i
d
+
1
[
k
]
dp[i][j][k]=\sum_{mid=j}^{k-1} dp[i-1][j][mid] \cdot dp[i-2][mid+1[k]
dp[i][j][k]=∑mid=jk−1dp[i−1][j][mid]⋅dp[i−2][mid+1[k]
Code:https://codeforces.com/contest/946/submission/173902552