https://www.luogu.org/problemnew/show/P2679
f(k,i,j)f(k,i,j)表示分了k段,用了第一个串中的前i个数字,已经构成了第二个串的前j个的方案数
f(k,i,j)={∑f(k−1,l,j−1)∑f(k−1,l,j−1)+f(k,i−1,j−1)当s1[i]==s2[j]且s1[i−1]!=s2[j−1]当s1[i]==s2[j]且s1[i−1]==s2[j−1]其中0<l<i其中0<l<i
#include<iostream> long long f[201][201] = {1}, sum[201][201], n, m, ki; char a[1001], b[201]; int main() { std:: cin >> n >> m >> ki >> a >> b; for(int i = 1; i <= n; i ++) for(int j = m; j >= 1; j --) for(int k = ki; k >= 1; k --) f[j][k] = (f[j][k] + (sum[j][k] = a[i - 1] == b[j-1] ? sum[j - 1][k] + f[j - 1][k - 1] : 0)) % 1000000007; std:: cout << f[m][ki]; }