• p2679 子串


    传送门

    分析

    我们可以用dp[i][j][k][0/1]表示A串考虑到第i个,B串考虑到第j个,一共取了k个子串,现在的A[i]是否被选的方案数。我们需要将第一维滚动一下。具体转移见代码。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    const int mod = 1e9+7;
    #define add(x,y) x=(x+y)%mod
    int dp[2][1100][210][2],n,m,t;
    char A[1100],B[1100];
    int main(){
          int i,j,k,now=0;
          scanf("%d%d%d",&n,&m,&t);
          scanf("%s",A);
          scanf("%s",B);
          for(i=n;i>0;i--)A[i]=A[i-1];
          for(i=m;i>0;i--)B[i]=B[i-1];
          dp[now][0][0][0]=1;
          for(i=1;i<=n;i++){
              now^=1;
              memset(dp[now],0,sizeof(dp[now]));
              dp[now][0][0][0]=1;
              for(j=1;j<=m;j++)
                for(k=1;k<=t;k++){
                    add(dp[now][j][k][0],
                  (dp[now^1][j][k][0]+dp[now^1][j][k][1])%mod);
                    if(A[i]==B[j]){
                      add(dp[now][j][k][1],dp[now^1][j-1][k][1]);
                      add(dp[now][j][k][1],
                    (dp[now^1][j-1][k-1][0]+dp[now^1][j-1][k-1][1])%mod);
                    }else dp[now][j][k][1]=0;
                }
          }
          printf("%d
    ",(dp[now][m][t][1]+dp[now][m][t][0])%mod);
          return 0;
    }
  • 相关阅读:
    windows7触屏编程
    改变窗口大小,恢复以前的大小
    insert()
    index()
    help()
    id()
    extend()
    count()
    cmp()
    append()
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/9721899.html
Copyright © 2020-2023  润新知