题意理解
求有多少对 (x,y)(x, y)(x,y),其中 xxx 是 SSS 的子串(连续),yyy 是 TTT 的子序列(不连续),且 xxx 和 yyy 内容相同。不同位置的子串/子序列视为不同。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
思路分析
设 dp[i][j]dp[i][j]dp[i][j] 表示:SSS 的以第 iii 个字符结尾的所有子串,与 TTT 的前 jjj 个字符中的子序列匹配的总方案数。
即 dp[i][j]=∑l=1idp[i][j] = \sum_{l=1}^{i}dp[i][j]=∑l=1i (TTT 前 jjj 个字符中等于 S[l..i]S[l..i]S[l..i] 的子序列数量)
状态转移:
考虑是否使用 T[j]T[j]T[j]:
1. 不使用 T[j]T[j]T[j]:dp[i][j−1]dp[i][j-1]dp[i][j−1]
2. 使用 T[j]T[j]T[j](需要 T[j]=S[i]T[j] = S[i]T[j]=S[i]):
* 子串长度为 1:贡献 111(空子序列 + T[j]T[j]T[j])
* 子串长度 >1> 1>1:需要 TTT 前 j−1j-1j−1 个字符中匹配 S[l..i−1]S[l..i-1]S[l..i−1] 的方案数,即 dp[i−1][j−1]dp[i-1][j-1]dp[i−1][j−1]
dp[i][j]=dp[i][j−1]+(T[j]=S[i] ? dp[i−1][j−1]+1:0)dp[i][j] = dp[i][j-1] + (T[j] = S[i] \text{ ? } dp[i-1][j-1] + 1 : 0) dp[i][j]=dp[i][j−1]+(T[j]=S[i] ? dp[i−1][j−1]+1:0)
边界条件:
* dp[0][j]=0dp[0][j] = 0dp[0][j]=0,dp[i][0]=0dp[i][0] = 0dp[i][0]=0
答案: sumi=1ndp[i][m]\\sum_{i=1}^{n} dp[i][m]sumi=1n dp[i][m]
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
参考代码