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

Codeforces Round #635 (Div. 2) E.Kaavi and Magic Spell(区间dp)

时间:2020-04-17 12:35:45      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:设计   匹配   round   mod   %s   预处理   using   force   kaa   

 

设计状态dp[i][j]表示T串Ti到Tj(区间i,j)匹配到的个数

由于T串比S串小,所以在区间(m,n)可以插入的字符串是任意的。

转移方程 if s[i] = t[l],dp[l][r] = dp[l][r] + dp[l+1][r]

               if  s[i] = t[r] ,dp[l][r] = dp[l][r]  + dp[l][r-1]

              if l>m || r>m  dp[l][r] = dp[l][r] + dp[l+1][r],dp[l][r] = dp[l][r]  + dp[l][r-1] 因为超过T串m长度的部分可以任意插入字符串

注意:预处理dp[i][i-1] = 1,表示插入空串的操作数初始时有1种。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn = 1e5+5;
 5 const ll mod = 998244353;
 6 ll dp[3005][3005];
 7 char s[3005],t[3005];
 8 int main(){
 9     int n,m;
10     scanf("%s",s+1);
11     scanf("%s",t+1);
12     n = strlen(s+1),m = strlen(t+1);
13     for(int i = 1;i<=3004;i++) dp[i][i-1] = 1;
14     for(int i = 1;i<=n;i++){
15         for(int l = 1,r = l + i - 1;r<=n;l++,r++){
16             if(l>m || s[i] == t[l]) dp[l][r] = (dp[l+1][r] + dp[l][r])%mod;
17             if(r>m || s[i] == t[r]) dp[l][r] = (dp[l][r-1] + dp[l][r])%mod;
18         }
19     }
20     ll ans = 0;
21     for(int i = m;i<=n;i++) ans = (ans + dp[1][i])%mod;
22     printf("%lld\n",ans);
23     return 0;
24 }

 

Codeforces Round #635 (Div. 2) E.Kaavi and Magic Spell(区间dp)

标签:设计   匹配   round   mod   %s   预处理   using   force   kaa   

原文地址:https://www.cnblogs.com/AaronChang/p/12718962.html

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