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. Tensorflow实例:利用LSTM预测股票每日最高价(一)

    RNN与LSTM 这一部分主要涉及循环神经网络的理论,讲的可能会比较简略. 什么是RNN RNN全称循环神经网络(Recurrent Neural Networks),是用来处理序列数据的.在传统的神 ...

  2. Nginx+Tomcat+Memcached部署

    环境清单列表:(因为只有三台电脑,所有把Nginx和memcached放到一起) 应用服务器1:192.168.51.10: 应用服务器2:192.168.55.110: memcached服务器:1 ...

  3. java内存溢出的解决思路

    原文地址:https://www.cnblogs.com/200911/p/3965108.html 内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能 ...

  4. #个人博客作业Week1——流行的源程序版本管理软件和项目管理软件

    1.TFS(Team Foundation Server)(1)定义:TFS是一个高可扩展.高可用.高性能.面向互联网服务的分布式文件系统,主要针对海量的非结构化数据,          它构筑在普通 ...

  5. GIthub地址

    https://github.com/cuibaoxue/Text1

  6. 剑值offer:最小的k个数

    这是在面试常遇到的topk问题. 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解题思路: 思路一:用快排对数 ...

  7. 第三个Sprint冲刺第八天(燃尽图)

  8. JAVA中方法和变量在继承中的覆盖和隐藏

    出处:http://renyanwei.iteye.com/blog/258304 我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际 ...

  9. java的OutOfMemoryError: PermGen space实战剖析

    由Word导出为PDF,导致java.lang.OutOfMemoryError: PermGen space 永生代空间不足,导致内存溢出,用jvisualvm监控了一下,永生代默认值80~90M, ...

  10. node多文件处理方法

    let events = require('events'); let fs = require('fs'); // 将readfile封装成一个方法 多文件处理  function fnreadFi ...