算法:
鸽鸽鸽了。。。。。
Code:
#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define mo 1000000007
using namespace std;
template<typename T> void chkmo(T &x,T y){x=(x+(y%mo))%mo;}
template<typename T> void read(T &num){
char c=getchar();num=0;T f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+(c^48);c=getchar();}
num*=f;
}
template<typename T> void qwq(T x){
if(x>9)qwq(x/10);
putchar(x%10+'0');
}
template<typename T> void write(T x){
if(x<0){x=-x;putchar('-');}
qwq(x);putchar('\n');
}
int A[1010];int B[210];
int dp[2][210][210][2];
int main(){
int n,m,k;read(n);read(m);read(k);
int temp1,temp2;temp1=temp2=0;
char c=getchar();
while(c<'a'||c>'z'){c=getchar();}
while('a'<=c&&c<='z'){A[++temp1]=c-'a'+1;c=getchar();}
while(c<'a'||c>'z'){c=getchar();}
while('a'<=c&&c<='z'){B[++temp2]=c-'a'+1;c=getchar();}
int tmp=1;
dp[0][0][0][0]=1;
rep(i,1,n){
dp[tmp][0][0][0]=1;
rep(j,1,min(i,m)){
rep(l,1,min(j,k)){
dp[tmp][j][l][0]=dp[tmp][j][l][1]=0;
chkmo(dp[tmp][j][l][0],dp[1-tmp][j][l][0]+dp[1-tmp][j][l][1]);
if(A[i]==B[j]){
chkmo(dp[tmp][j][l][1],dp[1-tmp][j-1][l-1][0]+dp[1-tmp][j-1][l-1][1]);
chkmo(dp[tmp][j][l][1],dp[1-tmp][j-1][l][1]);
}
}
}
tmp=1-tmp;
}
write((dp[1-tmp][m][k][0]+dp[1-tmp][m][k][1])%mo);
return 0;
}