rt,写了个四维的 dp,f[i][j][l][p] 表示截至 a 的前 i 字符凑出 b 的前 j 字符并且用了 l 段,p 表示 a 的第 i 位是否取
写了滚动数组
#include<iostream>
using namespace std;
const int mod=1e9+7;
int n,m,k;
char a[1010],b[1001];
int f[2][205][205][2];
int main(){
cin>>n>>m>>k;
scanf("%s%s",a+1,b+1);
f[0][0][0][0]=1;
f[1][0][0][0]=1;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
for(int l=0;l<=m;++l){
f[i&1][j][l][0]+=(f[i&0][j][l][0]+f[i&0][j][l][1])%mod;
if(a[i]==b[j]){
f[i&1][j][l][1]=(f[i&0][j-1][l-1][0]+f[i&0][j-1][l][1]+f[i&0][j-1][l-1][1])%mod;
}
else{
f[i&1][j][l][1]=0;
}
}
// cout<<f[1][1][1][1]<<endl;
cout<<f[n][m][k][1]+f[n][m][k][0]<<endl;
return 0;
}