CF1336C Kaavi and Magic Spell(区间dp)

根据题意,本题只关心前缀t是否匹配,而其他位置并不在意

因此我们将题目抽象成将s转转化为t串,其中t串的前m个是指定的,后面的是随意的

又因为s串从头往后并且可以插到两边,自然想到了区间dp,看数据范围也感觉很对,因为区间dp就是向两边扩充

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
const int mod=998244353;
int f[3010][3010];
int main(){
    string s,t;
    cin>>s>>t;
    s=" "+s;
    t=" "+t;
    int len,l,r;
    int n=(int)s.size()-1;
    int m=(int)t.size()-1;
    for(int i=1;i<=n+1;i++)
        f[i][i-1]=1;
    for(len=1;len<=n;len++){
        for(l=1;l+len-1<=n;l++){
            r=l+len-1;
            if(l>m||s[len]==t[l])
                f[l][r]=(f[l][r]+f[l+1][r])%mod;
            if(r>m||s[len]==t[r])
                f[l][r]=(f[l][r]+f[l][r-1])%mod;
        }
    }
    int ans=0;
    for(int i=m;i<=n;i++)
        ans=(ans+f[1][i])%mod;
    cout<<ans<<endl;

}
View Code

 

posted @ 2020-04-28 22:53  朝暮不思  阅读(180)  评论(0编辑  收藏  举报