[洛谷P2679]子串:DP

分析:
挺简单的.
代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
typedef long long LL;

const int MAXN=1005;
const int MAXM=205;
const LL MOD=1e9+7;
int n,m,k;
LL f[2][MAXM][MAXM][2];
char a[MAXN],b[MAXM];

int main(){
    scanf("%d%d%d",&n,&m,&k);
    getchar();
    scanf("%s\n%s",a+1,b+1);
    f[0][0][0][0]=1;
    for(int i=1;i<=n;i++){
        int r=(i&1);
        for(int j=0;j<=m;j++)
            for(int p=0;p<=std::min(m,k);p++){
                f[r][j][p][0]=(f[r^1][j][p][0]+f[r^1][j][p][1])%MOD;
                if(j&&p&&a[i]==b[j]) f[r][j][p][1]=(f[r^1][j-1][p-1][0]+f[r^1][j-1][p][1]+f[r^1][j-1][p-1][1])%MOD;
                else f[r][j][p][1]=0;
//              printf("f[%d][%d][%d][%d]==%d\n",i,j,p,0,f[r][j][p][0]);
//              printf("f[%d][%d][%d][%d]==%d\n",i,j,p,1,f[r][j][p][1]);
            }
    }
    printf("%lld\n",(f[n&1][m][k][0]+f[n&1][m][k][1])%MOD);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/ErkkiErkko/p/9663318.html