• P2679 子串


    ——————————————————————————————————————————————————

    成功推错方程//哭泣

    一开始选择的思路是用ai与bj相等时去找a中与bj-1相等的a并累加,在顺手求一个前缀和优化

    但由于想本题的时间太过久远,许多细节想不起来了,而起初值与终值也找不到

    采用的题解中的连续增长,加入常规的0/1表示末尾为是否被使用

    #include<bits/stdc++.h>
    using namespace std;
    const int mds=1000000007;
    int n,m,k,f[2][201][201][2],cnt;
    char a[1100],b[1100];
    int main()
    {
        cin>>n>>m>>k>>a+1>>b+1;
        for(int i=1;i<=n;i++)
        {    int now=i%2,last=(i-1)%2;
            f[now][1][1][0]=cnt;
            if(a[i]==b[1])f[now][1][1][1]=1,cnt++;
            else f[now][1][1][1]=0;
            for(int j=2;j<=m;j++)
            for(int p=1;p<=k;p++)
            {
                f[now][j][p][0]=(f[last][j][p][1]+f[last][j][p][0])%mds;
                f[now][j][p][1]=(a[i]==b[j])*((f[last][j-1][p-1][1]+f[last][j-1][p-1][0])%mds+f[last][j-1][p][1])%mds;
            }
        }
        cout<<(f[n%2][m][k][1]+f[n%2][m][k][0])%mds;
    }

    使用now与last后,初值就麻烦一点了,显然当i不选时,之前所有与b1相等的数量就是方案数,i选时则判断后确定0/1即可

    方程②中的三项为选i-1并相连,不相连,及不选择i-1

  • 相关阅读:
    Openssl自签发SSL证书
    营业执照信息识别
    kubernetes容器编排YAML详解
    drf的序列化
    K8S存储
    身份证信息识别
    6.Stream
    11.17个提升开发效率的“轮子”
    1.中台
    8.函数式接口
  • 原文地址:https://www.cnblogs.com/SFWR-YOU/p/11047875.html
Copyright © 2020-2023  润新知