[NOIP2015提高组]子串
题目:洛谷P2679、Vijos P1982、codevs4560、UOJ#149。
题目大意:有长度为n的A串和长度为m的B串。现在要从A串中取出k个互不重叠的子串,使它们按顺序相连后得到B串。问有多少种方案。
解题思路:DP。
设f[i][j[[k][0]表示A的前i个字符匹配B的前j个字符,划分成k段,且当前A串这个字符不取的情况下的方案数。
f[i][j][k][1]则表示A的前i个字符匹配B的前j个字符,划分成k段,且当前A串这个字符取的情况下的方案数。
容易得出,$f[i][j][k][0]=f[i-1][j][k][0]+f[i-1][j][k][1]$,即从第i-1个状态直接转移过来。
$f[i][j][k][1]=f[i-1][j-1][k-1][0]+f[i-1][j-1][k-1][1]+f[i-1][j-1][k][1](当a[i]=b[j]时)$,分别表示前一个不取当前独成一个子串的情况,前一个取当前独成一个子串的情况和前一个取当前和前一个成同一个子串的情况。
边界$f[i][0][0][0]=1$。
最后答案为$f[n][m][k][0]+f[n][m][k][1]$。
四维数组开不下怎么办?观察状态转移方程可以发现,i的状态总是从i-1转移过来,与其他状态无关。故我们滚动第一维即可。
时间复杂度$O(nmk)$。
C++ Code:
#include<iostream>
#include<cstring>
#define ll long long
#define oo 1000000007
using namespace std;
ll f[2][202][202][2];
int n,m,K;
char a[1050],b[202];
int main(){
memset(f,0,sizeof f);
ios::sync_with_stdio(false);
cin>>n>>m>>K>>(a+1)>>(b+1);
f[0][0][0][0]=1;
for(int i=1;i<=n;++i){
int c=i&1;
memset(f[c],0,sizeof f[c]);
f[c][0][0][0]=1;
for(int j=1;j<=m&&j<=i;++j){
for(int k=1;k<=K&&k<=j;++k){
f[c][j][k][0]=(f[c^1][j][k][0]+f[c^1][j][k][1])%oo;
if(a[i]==b[j])
f[c][j][k][1]=(f[c^1][j-1][k-1][1]+f[c^1][j-1][k-1][0]+f[c^1][j-1][k][1])%oo;
}
}
}
cout<<(f[n&1][m][K][0]+f[n&1][m][K][1])%oo<<endl;
return 0;
}
[NOIP2015提高组]子串的更多相关文章
- 刷题总结——子串(NOIP2015提高组)
题目: 题目背景 NOIP2015 提高组 Day2 T2 题目描述 有两个仅包含小写英文字母的字符串 A 和 B .现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在 ...
- 【题解】NOIP2015提高组 复赛
[题解]NOIP2015提高组 复赛 传送门: 神奇的幻方 \([P2615]\) 信息传递 \([P2661]\) 斗地主 \([P2668]\) 跳石头 \([P2678]\) 子串 \([P26 ...
- [NOIP2015] 提高组 洛谷P2615 神奇的幻方
题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...
- 洛谷-神奇的幻方-NOIP2015提高组复赛
题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,--,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...
- 洛谷 P2678 & [NOIP2015提高组] 跳石头
题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...
- 【数据结构】运输计划 NOIP2015提高组D2T3
[数据结构]运输计划 NOIP2015提高组D2T3 >>>>题目 [题目描述] 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航 ...
- 【二分查找】 跳石头NOIP2015提高组 D2T1
[二分查找]跳石头NOIP2015提高组 D2T1 >>>>题目 [题目描述] 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石 ...
- noip2015 提高组 day1t1 神奇的幻方
题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,--,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...
- NOIP2015 提高组] 运输计划
码农题啊兄弟们. 随便考虑二分一下,然后发现要取一条满足性质的边. 被所有大于\(mid\)的路径都覆盖,取了之后能把他们都弄到小于\(mid\) 那就树上差分再处理一下. 写了\(180h\),老年 ...
随机推荐
- luogu 1351 联合权值
联合权值 题目大意 给你一个图,有\(n-1\)条边,距离均为\(1\),每距离为\(2\)的两个点的联合权值为\(W_u \times W_v\),求联合权值的最大值和联合权值总和. solutio ...
- 项目结合activiti工作流框架使用
项目结合activiti工作流框架使用: 1.项目与工作流框架的结合. 2.状态:草稿(待审批).审批中.审批通过.审批失败 3. 提交审批: 0 草稿(待审批),记录绑定工作流执行id,审批状态设置 ...
- 玩转HTML5移动页面(动效篇)
为一名前端,在拿到设计稿时你有两种选择: 快速输出静态页面 加上高级大气上档次狂拽炫酷屌炸天的动画让页面动起来 作为一个有志向的前端,当然是选2啦!可是需求时间又很短很短,怎么办呢? 这次就来谈谈一些 ...
- 路飞学城Python-Day2
13.变量的定义规范 变量的含义:变量就是定义之后还能发生改变,可以重新赋值的量;变量的定义规范:名字不能随便起,声明一个变量,name = "123"[变量 = 值]变量定义规则 ...
- 前端换行显示,后端返回<br>
- C# AES 加解密处理
引言 这是一个有关AES加解密的方法类 一.设置AES加解密密钥:下面列出自己分配的三类密钥 private const string UserKey = "roshan-2015-user ...
- 利用js自带函数 数组去重
<script> ,,]; //原数组 var a=[]; //定义空数组 arr.map(function(x){ //用 map 遍历数组 ){ //如果当前值没有存在空数组中 a.p ...
- Centos7 安装 opencv
Centos7 安装 opencv CentOS Linux release 7.2.1511 (Core) 1.安装依赖 yum install https://dl.fedorap ...
- 详解:(cron , crontab , anacron)
导读: 人类把时间做了切割,想象一条笔直的线永远向前,本来这条直线上什么都没有,但是人类根据时间的长短(单位)在这条直线上做了密密麻麻的标记(世纪-年-月-日-时-分-秒-纳秒......),通过这样 ...
- 紫书 例题 10-1 UVa 11582 (unsigned long long+模)
(1)这道题要用到 unsigned long long, 弄了我好久 这道题范围可以达到2的64次方-1, 而long long 最多到2的63次方-1, 而unsigned long long可以 ...