【Luogu】P2679子串(DP)
GuessYCB的题解讲的很棒。就这样。
因为这题我不会,而题解又讲的太全太详细太好了。
#include<cstdio> #include<cctype> #include<cstring> #include<algorithm> #define mod 1000000007 inline int Map(char x){ return x-'a'+1;} inline long long read(){ long long num=0,f=1; char ch=getchar(); while(!isdigit(ch)){ if(ch=='-') f=-1; ch=getchar(); } while(isdigit(ch)){ num=num*10+ch-'0'; ch=getchar(); } return num*f; } long long f[3][1010][1010]; long long d[3][1010][1010]; char s[1010],c[1010]; int main(){ int n=read(),m=read(),q=read(); scanf("%s",s+1); scanf("%s",c+1); int now=1,past=0; f[0][0][0]=1; for(int i=1;i<=n;++i){ f[now][0][0]=1; for(int j=1;j<=m;++j) for(int k=1;k<=q;++k){ if(s[i]==c[j]) d[now][j][k]=(f[past][j-1][k-1]+d[past][j-1][k])%mod; else d[now][j][k]=0; f[now][j][k]=(f[past][j][k]+d[now][j][k])%mod; } std::swap(now,past); } printf("%lld",f[past][m][q]); return 0; }