【DP】NOIP2015Day2T2[子串]题解

来源:互联网 发布:c语言 while break 编辑:程序博客网 时间:2024/06/05 04:39

解题报告

直接DP, f[i][j][k][0/1] 表示 A 串前 i 位匹配 Bj 位,拿出了 k 个子串, i 位没选/选了的方案数。

好像有三维做法,但是我不会……

示例程序

#include<cstdio>#include<cstring>using namespace std;const int maxn=1000,maxm=200,MOD=1e9+7;int n,m,K;char A[maxn+5],B[maxm+5];int f[2][maxm+5][maxm+5][2];inline void AMOD(int &x,int tem) {if ((x+=tem)>=MOD) x-=MOD;}int main(){    freopen("substring.in","r",stdin);    freopen("substring.out","w",stdout);    scanf("%d%d%d%s%s",&n,&m,&K,A+1,B+1);    f[0][0][0][0]=1;    for (int i=1,c=1;i<=n;i++,c^=1)    for (int j=0;j<=i&&j<=m;j++)    for (int k=0;k<=j&&k<=K;k++)    {        AMOD(f[c][j][k][0]=f[c^1][j][k][0],f[c^1][j][k][1]);f[c][j][k][1]=0;        if (j&&k&&A[i]==B[j])        {            AMOD(f[c][j][k][1]=f[c^1][j-1][k][1],f[c^1][j-1][k-1][0]);            AMOD(f[c][j][k][1],f[c^1][j-1][k-1][1]);        }    }    return printf("%d\n",(f[n&1][m][K][0]+f[n&1][m][K][1])%MOD),0;}
原创粉丝点击