dp题
状态自己想出来了,但是初始化没有弄好,看了题解
#include<iostream> #include<cstdio> #define ri register int #define u long long namespace opt { inline u in() { u x(0),f(1); char s(getchar()); while(s<'0'||s>'9') { if(s=='-') f=-1; s=getchar(); } while(s>='0'&&s<='9') { x=(x<<1)+(x<<3)+s-'0'; s=getchar(); } return x*f; } } using opt::in; #define NN 90005 #define MO 1000000007 #include<cstring> namespace mainstay { u N,M,K,f[2][205][205][2]; char a[1005],b[1005]; inline void solve() { scanf("%lld%lld%lld",&N,&M,&K); scanf("%s%s",a+1,b+1); f[0][0][0][0]=f[1][0][0][0]=1; for(ri i(1);i<=N;++i){ for(ri j(1);j<=M;++j){ for(ri k(1);k<=K;++k){ f[i&1][j][k][0]=(f[i&1^1][j][k][0]+f[i&1^1][j][k][1])%MO; if(a[i]==b[j]) f[i&1][j][k][1]=((f[i&1^1][j-1][k-1][0]+f[i&1^1][j-1][k-1][1])%MO+f[i&1^1][j-1][k][1])%MO; else f[i&1][j][k][1]=0; } } } printf("%lld",(f[N&1][M][K][1]+f[N&1][M][K][0])%MO); } } int main() { //freopen("x.txt","r",stdin); mainstay::solve(); }