[NOIP2015]子串 题解
题目描述
有两个仅包含小写英文字母的字符串A和B。
现在要从字符串A中取出k个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一个新的字符串,请问有多少种方案可以使得这个新串与字符串 B 相等?
注意:子串取出的位置不同也认为是不同的方案。
输入格式
第一行是三个正整数 n,m,k,分别表示字符串 A 的长度,字符串 B 的长度,以及问题描述中所提到的 k,每两个整数之间用一个空格隔开。
第二行包含一个长度为 n 的字符串,表示字符串A。
第三行包含一个长度为 m 的字符串,表示字符串B。
输出格式
输出共一行,包含一个整数,表示所求方案数。
由于答案可能很大,所以这里要求输出答案对 1,000,000,007 取模的结果。
数据范围
$ 1 \le n \le 1000, \\\\
1 \le m \le 200,\\\\
1 \le k \le m\\\\ $
$Solution:$
只要看出来是dp就很好做了。
设$dp[i][j][k][0/1]$表示匹配到a的第i位,b的前j位已完成匹配,用了k个子串,a的当前位选没选的方案数。
首先考虑这位不选的情况,显然有$dp[i][j][k][0]=dp[i-1][j][k][0]+dp[i-1][j][k][1]$。上一位选不选皆可。
如果要选这一位,首先必须保证$a_i=b_j$,那么你既可以在上一位也选的情况下沿用之前的那个串,又可以新开一个串,而新开一个串和上一位选不选没什么关系,所以三者相加。
滚动数组。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int N=1005;
int n,m,K;
char a[N],b[N];
ll dp[2][202][202][2];
int main()
{
scanf("%d%d%d",&n,&m,&K);
scanf("%s",a+1);scanf("%s",b+1);
dp[0][0][0][0]=dp[1][0][0][0]=1;
int now=0,pre=1;
for(int i=1;i<=n;i++)
{
now^=1,pre^=1;
//memset(dp[now],0,sizeof(dp[now]));
for(int j=1;j<=m;j++)
{
for(int k=1;k<=K;k++)
{
if(a[i]==b[j])
dp[now][j][k][1]=(dp[pre][j-1][k-1][0]+dp[pre][j-1][k][1]+dp[pre][j-1][k-1][1])%mod;
else dp[now][j][k][1]=0;
dp[now][j][k][0]=(dp[pre][j][k][0]+dp[pre][j][k][1])%mod;
}
}
}
ll ans=(dp[now][m][K][0]+dp[now][m][K][1])%mod;
cout<<ans<<endl;
return 0;
}
[NOIP2015]子串 题解的更多相关文章
- NOIP2015子串[序列DP]
题目背景 无 题目描述 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重 叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一 个 ...
- LOJ2424 NOIP2015 子串 【DP】*
LOJ2424 NOIP2015 子串 LINK 题目大意是给你两个序列,在a序列中选出k段不重叠的子串组成b序列,问方案数 首先我们不考虑相邻的两段,把所有相邻段当成一段进行计算 然后设dpi,j, ...
- [NOIP2015] 子串substring 题解
[题目描述] 有两个仅包含小写英文字母的字符串A和B.现在要从字符串A中取出k个互不重叠的非空子串,然后把这k个子串按照其在字符串A中出现的顺序依次连接起来得到一个新的字符串,请问有多少种方案可以使得 ...
- 题解【洛谷P2679】[NOIP2015]子串
题面 看到求方案数,还要对 \(1000000007\ (1e9+7)\) 取模,一般这样的问题都要考虑 动态规划. 我们设 \(dp_{i,j,k,0/1}\) 表示 \(A_{1\dots i}\ ...
- NOIP2015 子串
#149. [NOIP2015]子串 有两个仅包含小写英文字母的字符串 AA 和 BB. 现在要从字符串 AA 中取出 kk 个互不重叠的非空子串,然后把这 kk 个子串按照其在字符串 AA 中出现的 ...
- [DP][NOIP2015]子串
子串 题目描述 有两个仅包含小写英文字母的字符串 A 和 B. 现在要从字符串 A 中取出 k 个 互不重叠 的非空子串, 然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一个新的 ...
- [NOIP2015] 子串(dp)
题目描述 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一 个新的字符串,请问 ...
- [vijos1982][NOIP2015]子串
Description 有两个仅包含小写英文字母的字符串和.现在要从字符串中取出个互不重叠的非空子串,然后把这个子串按照其在字符串中出现的顺序依次连接起来得到一个新的字符串,请问有多少种方案可以使得这 ...
- 【uoj149】 NOIP2015—子串
http://uoj.ac/problem/149 (题目链接) 题意 给出两个字符串A.B,问从A中取出k个互不重叠的子串按顺序组成B的方案数. Solution 一看这种题目就是字符串dp,字符串 ...
随机推荐
- 安卓中java和js如何交互
1.安卓中java和js如何交互 在Android上怎样实现JAVA和JS交互呢?Android的webview是基于webkit内核的,webview中集成了js与java互调的接口函数,通过add ...
- jmeter uniq 取值方式设置
- seaborn教程2——颜色调控
原文转载 https://segmentfault.com/a/1190000014966210 Seaborn学习大纲 seaborn的学习内容主要包含以下几个部分: 风格管理 绘图风格设置 颜色风 ...
- python eval( ) 使用详解
1.解析表达式 (表达式是str类型)----最常用 a = 12 b = "联播" result1 = eval(a+3) # resu ...
- 查找idt table 所對應的page table in Linux
#include <linux/kernel.h> #include <linux/module.h> #include <linux/types.h> #incl ...
- jquery 操作select,checkbox,radio (整理)
在工作中经经常使用到select,checkbox,radio,今天有点空暇就整理一下,免得以后用的时候还要又一次找. 操作select下拉框 -- 获取值或选中项: 1, $("#sele ...
- Python之读写文本数据
知识点不多 一:普通操作 # rt 模式的 open() 函数读取文本文件 # wt 模式的 open() 函数清除覆盖掉原文件,write新文件 # at 模式的 open() 函数添加write ...
- Activiti6.0 java项目框架 spring5 SSM 工作流引擎 审批流程
工作流模块----------------------------------------------------------------------------------------------- ...
- Solr的学习使用之(四)建数据库(添加Core)、表(配置schema.xml)
1.数据库数据库就相当于solr里面的核.solr4.6不能使用界面提供的的Core Admin/Add Core来建立,会报错,不懂为啥:那就采用最 简单的办法:把solr下载包里面的\solr-4 ...
- spring-boot-shiro-jwt-redis实现登陆授权功能
一.前言 在微服务中我们一般采用的是无状态登录,而传统的session方式,在前后端分离的微服务架构下,如继续使用则必将要解决跨域sessionId问题.集群session共享问题等等.这显然是费力不 ...