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 ...
随机推荐
- 微信公众号h5页面自定义分享
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- git创建本地分支,推送到远程
创建本地分支git branch 分支名 例如:git branch dev,这条命令是基于当前分支创建的本地分支,假设当前分支是master(远程分支),则是基于master分支创建的本地分支dev ...
- ASP.NET Core 2.1 中的 HttpClientFactory (Part 2) 定义命名化和类型化的客户端
原文:https://www.stevejgordon.co.uk/httpclientfactory-named-typed-clients-aspnetcore 发表于:2018年1月 上一篇文 ...
- JAVA 插入注解处理器
JDK1.5后,Java语言提供了对注解(Annotation)的支持 JDK1.6中提供一组插件式注解处理器的标准API,可以实现API自定义注解处理器,干涉编译器的行为. 在这里,注解处理器可以看 ...
- 用ajax和PHP实现简单的流程管理
首先要先有一个新建流程的页面xinjian.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...
- java容器细节
1. 2. 3.报错的原因,object里面没有game()方法 4.关于3的解决方法以及另一个细节 .next() 会在取完这个值之后,指针向后走一位,所以迭代器里不要出现多次.next() 正确写 ...
- Python语言程序设计:Lab6
Reversing a List If you have time, you can try to write a function which will reverse a list recursi ...
- Django :中间 件与csrf
一.中间件 什么是中间件 中间件有什么用 自定义中间件 中间件应用场景 二.csrf csrf token跨站请求伪造 一.中间件 1.什么是中间件 中间件顾名思义,是介于request与respon ...
- 使用redis事物解决stringRedisTemplate.setIfAbsent()并设置过期时间遇到的问题
spring-date-redis版本:1.6.2场景:在使用setIfAbsent(key,value)时,想对key设置一个过期时间,同时需要用到setIfAbsent的返回值来指定之后的流程,所 ...
- brew install thrift
➜ ~ brew install thriftUpdating Homebrew...Warning: You are using macOS 10.11.We (and Apple) do not ...