洛谷P2679 子串

题目链接

  算是一个计数类的dp,首先我们先确定状态数有多少个,一个是字符串a现在匹配到了第几位,一个是字符串b现在匹配到了第几位,另一个就是我们现在分成了多少组从字符串a中挑选出一段子串。这三个状态是最直接的状态,还有另一个就是我们是否要选择当前的字符a[i]来进行匹配,这个只有两种可能也就是选或不选两种,我们分别用01来表示选或不选的决策。
对于我们状态转移的过程中只会出现两种可能也就是a[i]==b[j]或者a[i]b[j]这两种可能。

如果是a[i]==b[j]这种情况。

  我们可以选择选当前的位置上的a[i]去匹配,也可以不选择,这就又是两种决策了,所以这个状态我们在转移的时候选或不选两种都是要更新的。
如果是选就是

dp[i][j][p][1] = dp[i - 1][j - 1][p][1] + dp[i - 1][j - 1][p - 1][1] + dp[i - 1][j - 1][p - 1][0];

其中dp[i][j][p][1]表示的是在我们选择用当前的a[i]去和b[j]匹配并且将a[i]放在当前的子串中,dp[i - 1][j - 1][p][1]表示的是使用匹配前一次的状态并且使用当上一个字符的方案数,dp[i - 1][j - 1][p - 1][1]表示的是将当前匹配上的字符纳入上一次的子串中,并且使用上一次的字符的方案数,dp[i - 1][j - 1][p - 1][0]表示的就是使用匹配前一次的状态并且不使用上一次匹配的字符的方案数。
如果不选择当前的字符,那就是

dp[i][j][p][0] = dp[i - 1][j][p][0] + dp[i - 1][j][p][1];

表示的就是没有使用字符,并且b串匹配的长度还是j的方案数。

如果是a[i]b[j]这种情况的话

  我们只能选择不匹配的情况,转移方程同上。还有就是因为匹配不上所以这一次如果是选的这个字符的话,那么方案数一定是0,所以还有一个赋值的过程

dp[i][j][p][0] = dp[i - 1][j][p][0] + dp[i - 1][j][p][1]; dp[i][j][p][1] = 0;

完成上面的操作这个题就完成了

int main() { std::cin.tie(nullptr)->sync_with_stdio(false); int n, m, k; std::cin >> n >> m >> k; std::string sa, sb; std::cin >> sa >> sb; sa = " " + sa; sb = " " + sb; dp[1][0][0][0] = 1; dp[0][0][0][0] = 1; for (int i = 1; i <= n; i ++ ) { for (int j = 1; j <= m; j ++ ) { for (int p = 1; p <= k; p ++ ) { if (sa[i] == sb[j]) { dp[i % 2][j][p][1] = dp[(i - 1) % 2][j - 1][p][1] + dp[(i - 1) % 2][j - 1][p - 1][1] + dp[(i - 1) % 2][j - 1][p - 1][0]; dp[i % 2][j][p][0] = dp[(i - 1) % 2][j][p][0] + dp[(i - 1) % 2][j][p][1]; } else { dp[i % 2][j][p][0] = dp[(i - 1) % 2][j][p][0] + dp[(i - 1) % 2][j][p][1]; dp[i % 2][j][p][1] = 0; } } } } Z ans = dp[n % 2][m][k][1] +dp[n % 2][m][k][0]; std::cout << ans.val() << "\n"; return 0; }

__EOF__

本文作者HoneyGrey
本文链接https://www.cnblogs.com/Haven-/p/16220202.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   浅渊  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示