【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;
}
原文地址:https://www.cnblogs.com/cellular-automaton/p/7607738.html