P2679 子串 DP
P2679 子串 DP
从字符串A中取出\(k\)段子串,按原顺序拼接,问存在多少个方案使拼接的字符串与字符串B相同
淦,又是这种字符串dp
设状态\(ans[i][j][k]\)表示A串位置\(i\),B串位置\(j\),已取出\(k\)段字符串,不管当前位置\(i\)是否能匹配上的方案数,\(g[i][j][k]\)表示A串位置\(i\),B串位置\(j\),已取出\(k\)段字符串,当前A串位置\(i\)已匹配上B串位置\(j\)(即\(a[i]==b[j]\))的方案数。
状态转移:
if(a[i]==b[j]) // 如果匹配上了
g[i][j][p]=(g[i-1][j-1][p]+ans[i-1][j-1][p-1])%MOD;
// g[i-1][j-1][p] 表示与上一个匹配连在一起
// ans[i-1][j-1][p-1] 以前的方案数
else g[i][j][p]=0;
ans[i][j][p]=(g[i][j][p]+ans[i-1][j][p])%MOD;
// g[i][j][p] 现在新匹配上的
// ans[i-1][j][p] 以前的方案数
然后为了优化空间就上了滚动数组,见代码:
#include <cstdio>
#define MAXN 1010
#define MOD 1000000007
using namespace std;
int n,m,k;
int ans[3][MAXN][MAXN],g[3][MAXN][MAXN];
char a[MAXN],b[MAXN];
int main(){
scanf("%d %d %d", &n, &m, &k);
scanf("%s%s", a+1, b+1);
int cur=1;
ans[0][0][0]=1;
for(int i=1;i<=n;++i){
ans[cur][0][0]=1;
for(register int j=1;j<=m;++j)
for(register int p=1;p<=k;++p){
if(a[i]==b[j]) g[cur][j][p]=(g[cur^1][j-1][p]+ans[cur^1][j-1][p-1])%MOD;
else g[cur][j][p]=0;
ans[cur][j][p]=(g[cur][j][p]+ans[cur^1][j][p])%MOD;
}
cur^=1;
}
printf("%d\n", ans[cur^1][m][k]);
return 0;
}
P2679 子串 DP的更多相关文章
- 洛谷P2679 子串——DP
题目:https://www.luogu.org/problemnew/show/P2679 DP水题: 然而被摆了一道,下面加 // 的地方都是一开始没写好的地方...还是不周密: 仔细审题啊... ...
- Luogu P2679 子串(字符串+dp)
P2679 子串 题意 题目描述 有两个仅包含小写英文字母的字符串\(A\)和\(B\). 现在要从字符串\(A\)中取出\(k\)个互不重叠的非空子串,然后把这\(k\)个子串按照其在字符串\(A\ ...
- 洛谷 P2679 子串 解题报告
P2679 子串 题目描述 有两个仅包含小写英文字母的字符串\(A\)和\(B\). 现在要从字符串\(A\)中取出\(k\)个互不重叠的非空子串,然后把这\(k\)个子串按照其在字符串\(A\)中出 ...
- 洛谷P2679 子串 [noip2015] dp
正解:dp 解题报告: 感觉是道dp好题啊,所以就写了个题解 代码实现难度低,思维难度大,像我这种思维僵化傻逼选手只想到了爆搜+组合数学... 其实是道很妙的dp题!好趴也没有多妙主要大概是妙在想到了 ...
- 2018.11.04 洛谷P2679 子串(线性dp)
传送门 为什么前几年的noipnoipnoip总是出这种送分题啊? 这个直接线性dpdpdp不就完了吗? f[i][j][k][0/1]f[i][j][k][0/1]f[i][j][k][0/1]表示 ...
- 【Luogu】P2679子串(DP)
题目链接 GuessYCB的题解讲的很棒.就这样. 因为这题我不会,而题解又讲的太全太详细太好了. #include<cstdio> #include<cctype> #inc ...
- [NOIP2015] 提高组 洛谷P2679 子串
题目背景 无 题目描述 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一 个新 ...
- BZOJ.4032.[HEOI2015]最短不公共子串(DP 后缀自动机)
题目链接 1.求A的最短子串,它不是B的子串. 子串是连续的,对B建SAM,枚举起点,在SAM上找到第一个无法匹配点即可.O(n)用SAM能做吗..开始想错了. 2.求A的最短子串,它不是B的子序列. ...
- BZOJ 4032 Luogu P4112 [HEOI2015]最短不公共子串 (DP、后缀自动机)
这其实是道水题... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4032 (luogu)https://www.luog ...
随机推荐
- RT-Flash imxrt 系列rt1052 rt1060量产神器宣传
转载: 恩智浦半导体2017年10月正式发布了业内首款跨界处理器—i.MX RT系列,超强的性能.超高的性价比使得i.MX RT系列火遍大江南北,一度成为基于MCU的产品主控首选,尤其是那些对于性能有 ...
- Scratch编程:多彩的舞台(六)
“ 上节课的内容全部掌握了吗?反复练习了没有,编程最好的学习方法就是练习.练习.再练习.一定要记得多动手.多动脑筋哦~~” 01 — 游戏介绍 这是一款简单的小游戏,实现了一个小女孩在多彩的舞台上进行 ...
- Spring Boot集成redis完整实例
添加依赖: (Spring Data Redis) 启动redis: 配置文件中进行配置: redis基本使用思路: redis中不存在就查询数据库然后存入redis: 查看日志:
- ionic开发遇到的问题总结
前言 ionic是一个用来开发混合手机应用的,开源的,免费的代码库.可以优化html.css和js的性能,构建高效的应用程序,而且还可以用于构建Sass和AngularJS的优化.ionic会是一个可 ...
- Java内存模型学习笔记(一)—— 基础
1.并发编程模型的分类 在并发编程中,我们需要处理两个关键的问题:1.线程间如何通信,2.线程间如何同步.通信是指线程之间以何种机制来交换信息,同步是指程序用于不同线程之间操作发生相对顺序的机制. 在 ...
- [转载]Linux下非root用户如何安装软件
[转载]Linux下非root用户如何安装软件 来源:https://tlanyan.me/work-with-linux-without-root-permission/ 这是本人遇到的实际问题,之 ...
- python之爬取小说
继上一篇爬取小说一念之间的第一章,这里将进一步展示如何爬取整篇小说 # -*- coding: utf- -*- import urllib.request import bs4 import re ...
- jQuery遍历(3)
上期我们讲了遍历的祖先.后代和同胞的问题,现在我们讲讲遍历遍历过滤 三个最基本的过滤方法是:first(), last() 和 eq(),它们允许您基于其在一组元素中的位置来选择一个特定的元素.其他过 ...
- SMARTY的知识
smarty的原理: <?php class Smarty { $ldelimiter = "{";//左分隔符 $rdelimiter = "}";// ...
- Modelsim问题集锦
前言 收集工程调试中遇到的modelsim问题. 问题 (1)仿真发现时钟信号和理论上的数据信号没有边沿对齐. 解决:一般是时钟精度不匹配的问题. 如果想要1ns的精度则代码中的精度需设置为: v语法 ...