题意简述
给定两个字符串 A , B A,B A,B,保证 A A A比 B B B长,在 A A A中取出 k k k个不重叠的子串,使得顺序拼起来能得到 B B B,有多少不同的方案?(相同的子串从不同的位置被取出来也是不同的方案)。
PS:复杂度最高是 O ( A ∗ B 2 ) O(A*B^2) O(A∗B2),因为这个值约等于 4 ∗ 1 0 8 4*10^8 4∗108,所以不能带 l o g log log。
思路
很明显要 D P DP DP,因为计数题的方法也没几个,
- DP
- 数据结构优化暴力
- 组合数学
显然,2. 不行(至今没有数据结构能维护这个),3. 不会(太难了,像我会一样),只能考虑一下1。1虽然很难,但是从可做性来讲,只有这个了。
那么如何设状态呢?(千万不要怂,尽管开空间,到时候会优化的)
考虑设 d p [ i ] [ j ] [ k ] dp[i][j][k] dp[i][j][k]表示 A A A中前 i i i个位置,匹配到 B B B的前 j j j个位置,用了 k k k个子串。那么我们有转移:
d p [ i ] [ j ] [ k ] = d p [ i − 1 ] [ j − 1 ] [ k − 1 ] + d p [ i − 1 ] [ j − 1 ] [ k ] dp[i][j][k]=dp[i-1][j-1][k-1]+dp[i-1][j-1][k] dp[i][j][k]=dp[i−1][j−1][k−1