http://uoj.ac/problem/149 (题目链接)

题意

  给出两个字符串A、B,问从A中取出k个互不重叠的子串按顺序组成B的方案数。

Solution

  一看这种题目就是字符串dp,字符串dp的话套路都差不多。一开始我直接无脑${f[k][i][j]}$,表示从A串前缀${i}$中取出${k}$个子串组成B串前缀${j}$的方案数,但是这样做的话转移过来的状态有点多,不太好讨论。。于是我又开了一个${g}$数组来记录一种状态。

  于是,${g[k][i][j]}$表示从A串前缀${i}$中取出${k}$个子串组成B串前缀${j}$的方案数,并且最后一个子串的最后一个字母是${A[i]}$。${f[k][i][j]}$表示从A串前缀${i}$中取出${k}$个子串组成B串前缀${j}$的方案数,并且最后一个子串的最后一个字母不是${A[i]}$。

  那么转移就分两种情况:

  1.当${a[i]=b[i]}$,那么:${g[k][i][j]=f[k-1][i-1][j-1]+g[k][i-1][j-1]+g[k-1][i-1][j-1]}$。

  2.无论${a[i]}$是否等于${b[i]}$,${f[k][i][j]=f[k][i-1][j]+g[k][i-1][j]}$。

  很好理解吧。然后发现第一维的${k}$只会与前面的${k-1}$有关,为了节省空间我就把它滚动了。

细节

  滚动数组记得每次开始时清空。

代码

// uoj150
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define MOD 1000000007
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=1010;
LL f[2][maxn][210],g[2][maxn][210];
char a[maxn],b[maxn];
int n,m,K; int main() {
scanf("%d%d%d",&n,&m,&K);
scanf("%s",a+1);
scanf("%s",b+1);
int x=0;
for (int k=0;k<=K;k++)
for (int i=0;i<=n;i++) f[0][i][0]=f[1][i][0]=1;
for (int k=1;k<=K;k++) {
x^=1;
memset(f[x],0,sizeof(f[x]));memset(g[x],0,sizeof(g[x]));
for (int i=k;i<=n;i++)
for (int j=k;j<=min(i,m);j++) {
if (a[i]==b[j])
g[x][i][j]=(f[x^1][i-1][j-1]+g[x][i-1][j-1]+g[x^1][i-1][j-1])%MOD;
f[x][i][j]=(f[x][i-1][j]+g[x][i-1][j])%MOD;
}
}
printf("%lld",(f[x][n][m]+g[x][n][m])%MOD);
return 0;
}

  

【uoj149】 NOIP2015—子串的更多相关文章

  1. NOIP2015子串[序列DP]

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

  2. LOJ2424 NOIP2015 子串 【DP】*

    LOJ2424 NOIP2015 子串 LINK 题目大意是给你两个序列,在a序列中选出k段不重叠的子串组成b序列,问方案数 首先我们不考虑相邻的两段,把所有相邻段当成一段进行计算 然后设dpi,j, ...

  3. NOIP2015 子串

    #149. [NOIP2015]子串 有两个仅包含小写英文字母的字符串 AA 和 BB. 现在要从字符串 AA 中取出 kk 个互不重叠的非空子串,然后把这 kk 个子串按照其在字符串 AA 中出现的 ...

  4. [NOIP2015] 子串(dp)

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

  5. [vijos1982][NOIP2015]子串

    Description 有两个仅包含小写英文字母的字符串和.现在要从字符串中取出个互不重叠的非空子串,然后把这个子串按照其在字符串中出现的顺序依次连接起来得到一个新的字符串,请问有多少种方案可以使得这 ...

  6. [NOIP2015] 子串substring 题解

    [题目描述] 有两个仅包含小写英文字母的字符串A和B.现在要从字符串A中取出k个互不重叠的非空子串,然后把这k个子串按照其在字符串A中出现的顺序依次连接起来得到一个新的字符串,请问有多少种方案可以使得 ...

  7. NOIP2015 子串 (DP+优化)

    子串 (substring.cpp/c/pas) [问题描述] 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个 互不重 叠 的非空子串,然后把这 k 个子串按照其在字 ...

  8. [DP][NOIP2015]子串

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

  9. [NOIP2015]子串 题解

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

随机推荐

  1. PAT 1017. A除以B (20)

    本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数.你需要输出商数Q和余数R,使得A = B * Q + R成立. 输入格式: 输入在1行中依次给出A和B,中间以1空格分隔. 输出格 ...

  2. 基于.NET Socket API 通信的综合应用

    闲谈一下,最近和客户进行对接Scoket 本地的程序作为请求方以及接受方,对接Scoket 的难度实在比较大,因为涉及到响应方返回的报文的不一致性,对于返回的报文的格式我需要做反序列化的难度增大了不少 ...

  3. ModernUI教程:MEF应用向导

    本文主要说明在Modern UI框架下使用MEF的必要步骤,关于MEF请自行脑补. MEF-INTO-MUI实例代码下载: MefMuiApp.zip 1:创建一个导出属性 ModernFrame用来 ...

  4. GWT-Dev-Plugin(即google web toolkit developer plugin)for firefox的下载地址

    如果FireFox的版本为20,则对应google-web-toolkit的插件离线下载地址,不要用浏览器直接下载,用Flashget等客户端下载,超快. http://google-web-tool ...

  5. 准标识符(Quasi-dientifier, QI)

    Quasi-identifier From Wikipedia, the free encyclopedia Quasi-identifiers are pieces of information t ...

  6. C# EventHandler and Delegate(委托的使用)

    委托的声明 public delegate void MyDelegate(string str); 注 1.委托的定义和方法的定义类似,只是在前面加了一个delegate,但委托不是方法,它是一种特 ...

  7. Project Serve 2013部署方法

    在线版Project2013部署手册 服务器环境要求 系统:windows server 2008r2.windows server2012x64 Sharepoint 2013 内存至少16GB,最 ...

  8. linux基础-第十五单元 软件包的管理

    使用RPM安装及移除软件 什么是RPM rpm的文件名 rpm软件安装与移除工作中经常使用的选项 查看RPM软件包中的信息 查询已安装的软件包信息 RPM包的属性依赖性问题 什么是RPM包的属性依赖性 ...

  9. RAP在centos上的部署

    在centos7上部署RAP(非官方) 作者批注:该部署文档为网友贡献,仅供参考.war请参考主页README.md下载最新版本哟~~~ 感谢热情网友的Wiki整理!万分感谢! 系统: centos7 ...

  10. elasticsearch-查询基础篇

    elasticsearch的查询有两部分组成:query and filter. 两者的主要区别在于:filter是不计算相关性的,同时可以cache.因此,filter速度要快于query. 先记录 ...