Vijos1982 NOIP2015Day2T2 子串 substring 动态规划
子串 (substring.cpp/c/pas) 题目链接
【问题描述】
有两个仅包含小写英文字母的字符串 A 和 B。现在要从字符串 A 中取出 k 个 互不重叠 的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一
个新的字符串,请问有多少种方案可以使得这个新串与字符串 B 相等?注意:子串取出的位置不同也认为是不同的方案 。
【输入格式】
输入文件名为 substring.in。
第一行是三个正整数 n,m,k,分别表示字符串 A 的长度,字符串 B 的长度,以及问题描述中所提到的 k,每两个整数之间用一个空格隔开。
第二行包含一个长度为 n 的字符串,表示字符串 A。
第三行包含一个长度为 m 的字符串,表示字符串 B。
【输出格式】
输出文件名为 substring.out。
输出共一行,包含一个整数,表示所求方案数。 由于答案可能很大,所以这里要求对输出答案对 1,000,000,007 取模 的结果。
【输入输出样例 1】
substring.in
6 3 1
aabaab
aab
substring.out
2
【输入输出样例 2】
substring.in
6 3 2
aabaab
aab
substring.out
7
【输入输出样例 3】
substring.in
6 3 3
aabaab
aab
substring.out
7
【题解】
NOIP2015Day2T2
一道好好的DP题
我们用dp[i][j][k]表示在B串中匹配i个,在A串中匹配到的位置为j,共使用k个子串的方案总数,则dp[i][j][k]=Σdp[i-1][j'][k-1] +dp[i-1][j-1][k]
那么,对于Σ可以用前缀和优化,这样的时间就可以卡进去了,但是空间还是要炸,所以我们采用滚动数组来优化空间即可。详见代码。
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=+,M=+;
const int mod=1e9+;
char s1[N],s2[M];
int n,m,K;
int dp[][N][M],sum[][N][M];
//dp[i][j][k]=Σdp[i-1][j'][k-1](1<=j'<=j-1) +dp[i-1][j-1][k]
int main(){
scanf("%d%d%d%s%s",&n,&m,&K,s1+,s2+);
memset(dp,,sizeof dp);
memset(sum,,sizeof sum);
int I=,J=;
for (int i=;i<=n;i++){
if (s2[]==s1[i])
dp[][i][]=;
sum[][i][]=sum[][i-][]+dp[][i][];
}
for (int i=;i<=m;i++,I^=,J^=){
memset(dp[J],,sizeof dp[J]);
memset(sum[J],,sizeof sum[J]);
for (int j=;j<=n;j++){
if (s2[i]!=s1[j])
continue;
for (int k=;k<=K;k++)
if (j>=)
dp[J][j][k]=(sum[I][j-][k-]+dp[I][j-][k])%mod;
else
dp[J][j][k]=dp[I][j-][k];
}
for (int k=;k<=K;k++)
for (int j=;j<=n;j++)
sum[J][j][k]=(sum[J][j-][k]+dp[J][j][k])%mod;
}
printf("%d",sum[I][n][K]);
return ;
}
Vijos1982 NOIP2015Day2T2 子串 substring 动态规划的更多相关文章
- Luogu 2679 子串 (动态规划)
Luogu 2679 NOIP 2015 子串 (动态规划) Description 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k ...
- [LeetCode] 647. 回文子串 ☆☆☆(最长子串、动态规划、中心扩展算法)
描述 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串. 示例 1: 输入: "abc" ...
- 【LeetCode】最长回文子串【动态规划或中心扩展】
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: "bab"注意: " ...
- [LeetCode] 5. 最长回文子串 ☆☆☆(最长子串、动态规划)
最长回文子串 (动态规划法.中心扩展算法) https://leetcode-cn.com/problems/longest-palindromic-substring/solution/xiang- ...
- [vijos1982][NOIP2015]子串
Description 有两个仅包含小写英文字母的字符串和.现在要从字符串中取出个互不重叠的非空子串,然后把这个子串按照其在字符串中出现的顺序依次连接起来得到一个新的字符串,请问有多少种方案可以使得这 ...
- [NOIP2015] 子串substring 题解
[题目描述] 有两个仅包含小写英文字母的字符串A和B.现在要从字符串A中取出k个互不重叠的非空子串,然后把这k个子串按照其在字符串A中出现的顺序依次连接起来得到一个新的字符串,请问有多少种方案可以使得 ...
- 【NOIP2015】子串(动态规划)
题目戳我 题解 很简单的一道题... 看来那时候还是我太菜了... 设f[i][j][k][0/1]表示在第一个串中的位置i,匹配到了位置j,一共分了k段,0/1表示上一个位置是否在某一段中 转移就很 ...
- NOIP2015Day2T2子串(字符串dp)
又被“if(a=b)”坑了QAQ...写C++还是得开Warning,这么久了pascal还没改过来咋回事啊QWQ 题目大意就不说了OWO 网上的题解都不怎么看得懂啊...好像写得都很乱?还是我太sb ...
- 领扣-5 最长回文子串 Longest Palindromic Substring MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
随机推荐
- Android获取本机号码及运营商
import android.content.Context; import android.telephony.TelephonyManager; import android.util.Log; ...
- MS SQL Server 增删改查
数据插入 语法:INSERT INTO Table_name(field1,field2……fieldN) values(value1,vlaue2,…valueN) 单行插入用户类型 INSERT ...
- PHP中get请求中参数的key不能是para
¶会被转化成¶,然后就无法进行下去了. 仅作记录.
- npm dev run 报错
解决办法: npm run dev --port 8088 Error: listen EACCES 0.0.0.0:8080at Object.exports._errnoException (ut ...
- nginx 配置白名单
在http 模块 增加 geo $remote_addr $ip_whitelist{ default 0; include white_ip.conf; } 在location 模块 增加 (注意i ...
- Struts2框架的概述及学习重点
什么是Struts2的框架 * Struts2是Struts1的下一代产品,是在 struts1和WebWork的技术基础上进行了合并的全新的Struts 2框架. * 其全新的Struts 2的体系 ...
- Oracle Ora 错误解决方案合集
注:本文来源于 < Oracle学习笔记 --- Oracle ORA错误解决方案 > ORA-00001: 违反唯一约束条件 (.)错误说明:当在唯一索引所对应的列上键入重复值时,会触发 ...
- leetcode(js)算法之17电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母 示例: 输入:"23" 输出:[" ...
- window下tomcat的内存溢出问题
打开注册表:https://jingyan.baidu.com/article/49ad8bce09d6085835d8fa63.html Tomcat 内存溢出对应解决方式 Windows平台,使用 ...
- 常用的web服务器软件整理
(1)ApacheApache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上.Apache源于NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器软 ...