luogu_P2679 子串

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();

}

 

posted @ 2019-11-13 16:38  pai_hoo  阅读(81)  评论(0)    收藏  举报