给出
n
≤
2
e
3
n\leq2e3
n≤2e3的串
A
A
A,以及
m
≤
2
e
2
m\leq2e2
m≤2e2的串
B
B
B,现在求问从串
A
A
A中选择若干的字符并且按照原有的顺序形成
k
≤
2
e
2
k\leq2e2
k≤2e2个循环的
B
B
B串有多少种方案。
不是很会做的dp,不过这个有些类似
L
C
S
LCS
LCS的思想。
f
i
,
j
,
k
,
0
∣
1
f_{i,j,k,0|1}
fi,j,k,0∣1表示
A
A
A串匹配到
i
i
i位,
B
B
B串匹配到
j
j
j位,匹配了
k
k
k个
B
B
B串,并且当前位不选|选的方案数。
i
≥
0
i\geq0
i≥0,
f
i
,
0
,
0
,
0
=
1
,
f
i
,
0
,
0
,
1
=
0
f_{i,0,0,0}=1,f_{i,0,0,1}=0
fi,0,0,0=1,fi,0,0,1=0,因为取
0
0
0个空串只有
1
1
1种,但是限制取当前这位则不存在。
j
>
0
j>0
j>0,
f
0
,
j
,
0
,
0
=
f
0
,
j
,
0
,
1
=
0
f_{0,j,0,0}=f_{0,j,0,1}=0
f0,j,0,0=f0,j,0,1=0,没有选择的方案。
转移有:
f
i
,
j
,
k
,
0
=
f
i
−
1
,
j
,
k
,
0
+
f
i
−
1
,
j
,
k
,
1
f_{i,j,k,0}=f_{i-1,j,k,0}+f_{i-1,j,k,1}
fi,j,k,0=fi−1,j,k,0+fi−1,j,k,1
如果
a
i
=
b
j
a_{i}=b_{j}
ai=bj
f
i
,
j
,
k
,
1
=
f
i
−
1
,
j
−
1
,
k
−
1
,
0
+
f
i
−
1
,
j
−
1
,
k
−
1
,
1
+
f
i
−
1
,
j
−
1
,
k
,
1
f_{i,j,k,1}=f_{i-1,j-1,k-1,0}+f_{i-1,j-1,k-1,1}+f_{i-1,j-1,k,1}
fi,j,k,1=fi−1,j−1,k−1,0+fi−1,j−1,k−1,1+fi−1,j−1,k,1
否则
a
i
≠
b
j
a_{i}≠b_{j}
ai=bj
f
i
,
j
,
k
,
1
=
0
f_{i,j,k,1}=0
fi,j,k,1=0
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
const int N=1e3+7;
char A[N],B[N];
int f[2][205][205][2];
int main() {
int n,m,K;
scanf("%d%d%d",&n,&m,&K);
scanf("%s%s",A+1,B+1);
f[0][0][0][0]=f[1][0][0][0]=1;
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
for(int k=1;k<=K;k++) {
f[(i&1)][j][k][0]=(f[(i&1)^1][j][k][1]+f[(i&1)^1][j][k][0])%mod;
if(A[i]==B[j]) f[(i&1)][j][k][1]=(f[(i&1)^1][j-1][k-1][1]+(f[(i&1)^1][j-1][k][1]+f[(i&1)^1][j-1][k-1][0])%mod)%mod;
else f[(i&1)][j][k][1]=0;
}
}
}
printf("%d\n",(f[n&1][m][K][0]+f[n&1][m][K][1])%mod);
}