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