码迷,mamicode.com
首页 > 其他好文 > 详细

P2679 子串

时间:2019-06-18 21:53:47      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:++   图片   div   its   pac   ==   优化   last   mds   

技术图片技术图片

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

成功推错方程//哭泣

一开始选择的思路是用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

P2679 子串

标签:++   图片   div   its   pac   ==   优化   last   mds   

原文地址:https://www.cnblogs.com/SFWR-YOU/p/11047875.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!