P2679 子串

题目描述

有两个仅包含小写英文字母的字符串\(A\)和\(B\)。

现在要从字符串\(A\)中取出\(k\)个互不重叠的非空子串,然后把这\(k\)个子串按照其在字符串\(A\)中出现的顺序依次连接起来得到一个新的字符串。请问有多少种方案可以使得这个新串与字符串\(B\)相等?

注意:子串取出的位置不同也认为是不同的方案。

输入输出格式

输入格式:

第一行是三个正整数\(n,m,k\) ,分别表示字符串\(A\)的长度,字符串\(B\)的长度,以及问题描述中所提到的\(k\) ,每两个整数之间用一个空格隔开。

第二行包含一个长度为\(n\)的字符串,表示字符串\(A\) 。

第三行包含一个长度为\(m\)的字符串,表示字符串\(B\)。

输出格式:

一个整数,表示所求方案数。

由于答案可能很大,所以这里要求输出答案对1000000007取模的结果。

说明:

对于所有 10 组数据: \(1≤n≤1000,1≤m≤200,1≤k≤m\)。


这题好难想orz,,,

令dp[l][i][j][0/1]代表匹配到第\(l\)段时,A串匹配到第\(i\)段,B串匹配到第\(j\)段,A串的第\(i\)位是否处于匹配。

关于第四维的设计,我们由 B串必须完整匹配,而A串不需要完整匹配 推出

转移:

\(dp[l][i][j][1]=dp[l-1][i-1][j-1][1]+dp[l-1][i-1][j-1][0]+dp[l][i-1][j-1][1],a[i]==b[j]\)

\(dp[l][i][j][0]=dp[l][i-1][j][0]+dp[l][i-1][j][1]\)

这样空间肯定炸了的,我们考虑用滚动数组优化。

但是滚动数组优化的话,我们得稍稍处理一下\(a[i]!=b[j]\)时\(dp[l][i][j][1]\)的值为0,还有起始边界的置0,否则循环用会出问题。

一个细节,加三项时每两项都得膜,否则只有40分好像。。


code:

#include <cstdio>
const int N=1010;
const int M=203;
const int mod=1000000007;
char c1[N],c2[M];
int n,m,k,dp[2][N][M][2];
int main()
{
scanf("%d%d%d",&n,&m,&k);
scanf("%s%s",c1+1,c2+1);
for(int i=0;i<=n;i++)
dp[0][i][0][0]=1;
for(int l=1;l<=k;l++)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
{
if(c1[i]==c2[j])
dp[l&1][i][j][1]=((dp[(l-1)&1][i-1][j-1][1]+dp[(l-1)&1][i-1][j-1][0])%mod+dp[l&1][i-1][j-1][1])%mod;
else
dp[l&1][i][j][1]=0;
dp[l&1][i][j][0]=(dp[l&1][i-1][j][0]+dp[l&1][i-1][j][1])%mod;
}
if(l==2)
for(int i=0;i<=n;i++)
dp[0][i][0][0]=0;
}
printf("%d\n",(dp[k&1][n][m][0]+dp[k&1][n][m][1])%mod);
}

2018.6.10

洛谷 P2679 子串 解题报告的更多相关文章

  1. 洛谷 P2058 海港 解题报告

    P2058 海港 题目描述 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况: ...

  2. 洛谷 P3956 棋盘 解题报告

    P3956 棋盘 题目描述 有一个\(m×m\)的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色的(不能 ...

  3. 洛谷P2679 子串 [noip2015] dp

    正解:dp 解题报告: 感觉是道dp好题啊,所以就写了个题解 代码实现难度低,思维难度大,像我这种思维僵化傻逼选手只想到了爆搜+组合数学... 其实是道很妙的dp题!好趴也没有多妙主要大概是妙在想到了 ...

  4. 洛谷 P1979 华容道 解题报告

    P1979 华容道 题目描述 小\(B\)最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时 ...

  5. BZOJ 3545 / 洛谷 P4197 Peaks 解题报告

    P4197 Peaks 题目描述 在\(\text{Bytemountains}\)有\(N\)座山峰,每座山峰有他的高度\(h_i\).有些山峰之间有双向道路相连,共\(M\)条路径,每条路径有一个 ...

  6. 虔诚的墓主人(BZOJ1227)(洛谷P2154)解题报告

    题目描述 小W是一片新造公墓的管理人.公墓可以看成一块N×M的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地. 当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找一块合适墓地. ...

  7. [NOIP2015] 提高组 洛谷P2679 子串

    题目背景 无 题目描述 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一 个新 ...

  8. 洛谷P2679 子串——DP

    题目:https://www.luogu.org/problemnew/show/P2679 DP水题: 然而被摆了一道,下面加 // 的地方都是一开始没写好的地方...还是不周密: 仔细审题啊... ...

  9. 洛谷 P2679 子串

    题目背景 无 题目描述 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一 个新 ...

随机推荐

  1. 写入mssql出现乱码

    1.出现乱码的场景如下: --------------------------------------------------------------------------------------- ...

  2. Word frequency program ver.1

    先吐槽一下自己 做这个作业的时候完全没有提前考虑好时间 导致要提交前一天晚上通宵写代码 而且还满满的bug TAT 缓一口气 程序还在继续写 先把有点累 想着先把博客写了 PART I 预计时间: 语 ...

  3. 个人博客作业Week2 是否需要有代码规范

    问题:是否需要有代码规范 对于是否需要有代码规范,请考虑下列论点并反驳/支持: 1.这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. 2.我是个艺术家,手艺人,我有 ...

  4. 《Linux内核分析》第八周笔记 进程的切换和系统的一般执行过程

    20135132陈雨鑫 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ...

  5. 选择J2EE的SSH框架的理由

    选择J2EE的SSH框架的理由 Struts2框架: Struts2框架的基本思想是采用MVC设计模式,即将应用设计成模型(Model).视图(View)和控制器(Control)三个部分:控制部分由 ...

  6. phpcms全站搜索

    这篇博客已经移至http://www.cnblogs.com/nuanai/p/8028562.html中~~~~~~

  7. Spring整合SpringMVC

    整合:把在springMVC配置文件中的spring提取出来整合为另一份配置文件 希望: 1).Spring的配置文件只是用来配置和业务逻辑有关的功能(数据源.事务控制.切面....) 2).Spri ...

  8. 7-Python3从入门到实战—基础之数据类型(字典-Dictionary)

    Python从入门到实战系列--目录 字典的定义 字典是另一种可变容器模型,且可存储任意类型对象:使用键-值(key-value)存储,具有极快的查找速度: 字典的每个键值(key=>value ...

  9. FZU软工第五次作业-词组频率分析

    目录 00.前言: 01.分工: 02.PSP表格: 03.解题思路描述与设计实现说明: 解题思路简述: 关键代码 04.附加题设计与展示: 设计的创意独到之处 实现思路 实现成果展示 05.关键代码 ...

  10. PHP和JavaScript将字符串转换为数字string2int

    在看廖雪峰的JavaScript教程时,里面有一个题就是利用reduce()将string转换为int,我看评论中贴出的方法,当时觉得挺意外了,以为他只用了一行代码,即下面这行代码 var str=& ...