震惊!一sb少年被一个A题卡了半天!
题意简述
给定两个字符串$a,b$,求有多少对有序对$(x,y)$使得$x$是$a$的子串,$y$是$b$的子序列。两字符串长度$<=5000$,空间$5000\times 5000\times 5$是够的。
思路框架
裸的$DP$。
具体思路
$dp[i][j]$表示考虑$a$的前$i$位,$b$的前$j$位的答案。那么,$dp[i][j]$=$dp[i-1][k]$的和$+1$,其中$k\in [1,j-1]$,并且$a[i]==b[j]$。
这个转移式很好理解。就是在$ai$和$bj$相同的时候,两种情况
- 上一个位置的答案,就是前面的求和
- $a[i]$和$b[j]$取出来,也是一种方案。
但是,这个转移是$O(n^3)$的,那咋整嘛。
我们会发现,这个转移式珂以用前缀和优化。
设$sum[i][j]$表示$dp[i][1…j]$的和。然后$dp[i][j]=sum[i-1][j-1]+1$。
每次求完$dp$之后,维护一下$sum$。
时空复杂度最高$O(n^2)$。其中$n=5000$。稳过。
(相信CF的机子)
代码
1 |
|