• [NOIP 2015] 子串


    [题目链接]

                  http://uoj.ac/problem/149

    [算法]

             动态规划

             f[i][j][k][0 / 1]表示在A的前i位中选j个互不重叠的子串,与B的前k位相同,第i位选 / 不选的方案数

             可以用滚动数组优化空间复杂度

    [代码]

            

    #include<bits/stdc++.h>
    using namespace std;
    #define MAXN 1010
    #define MAXM 210
    const int P =  1000000007;
    
    int i,j,k,x,n,m,t;
    long long f[2][MAXM][MAXM][2];
    char a[MAXN],b[MAXM];
    
    int main() 
    {
            
            scanf("%d%d%d",&n,&m,&t);
            scanf("%s%s",a + 1,b + 1);
            f[0][0][0][0] = 1;
            for  (i = 1; i <= n; i++)
            {
                    for (j = 0; j <= min(i,t); j++)
                    {
                            for (k = 0; k <= m; k++)
                            {
                                    f[i & 1][j][k][0] = f[i & 1][j][k][1] = 0;
                                    f[i & 1][j][k][0] = (1ll * f[(i - 1) & 1][j][k][0] + 1ll * f[(i - 1) & 1][j][k][1]) % P;
                                    if (j == 0 || k == 0) continue;
                                    if (a[i] == b[k]) f[i & 1][j][k][1] = (1ll * f[(i - 1) & 1][j - 1][k - 1][0] + 1ll * f[(i - 1) & 1][j - 1][k - 1][1] + 1ll * f[(i - 1) & 1][j][k - 1][1]) % P;
                            }
                    }        
            } 
            printf("%lld
    ",(f[n & 1][t][m][0] + f[n & 1][t][m][1]) % P);
             
            return 0;
        
    }
  • 相关阅读:
    将字符数组写到字符串
    两种比较不错的密码修改方案
    数组的应用 结构类型 使用深复制和浅复制 显示员工信息
    字符串处理技巧
    uva 1339
    11039
    uva 11636
    Uva401Palindromes
    poj2524-Ubiquitous Religions
    Poj1611The Suspects
  • 原文地址:https://www.cnblogs.com/evenbao/p/9493526.html
Copyright © 2020-2023  润新知