欢迎来到SFWR的博客

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

posted @ 2019-06-18 21:17  SFWR  Views(101)  Comments(0Edit  收藏  举报