LOJ2424 NOIP2015 子串 【DP】*
LOJ2424 NOIP2015 子串
题目大意是给你两个序列,在a序列中选出k段不重叠的子串组成b序列,问方案数
首先我们不考虑相邻的两段,把所有相邻段当成一段进行计算
然后设dpi,j,k,0/1表示a使用了i为,b匹配到j位,一共有k段,当前这一位选不选的方案数
然后转移显然:
dpi,j,k,0=dpi−1,j,k,0+dpi−1,j,k,1
dpi,j,k,1=dpi−1,j−1,k,1+dpi−1,j−1,k−1,0(条件ai=bja_i=b_jai=bj)
然后之后的dp就非常显然了
把i滚动数组掉就可以了
然后注意数组清零和j和k的枚举下界是0。。。
#include<bits/stdc++.h>
using namespace std;
const int Mod=1e9+;
const int N=1e3+,M=2e2+;
#define fu(a,b,c) for(int a=b;a<=c;a++)
int dp[][M][M][];
int c[N][N];
int n,m,k,ind=;
char a[N],b[N];
int add(int a,int b){return (a+b)%Mod;}
int mul(int a,int b){return 1ll*a*b%Mod;}
void init() {
fu(i,,n)c[i][]=;
fu(i,,n)fu(j,,i)c[i][j]=add(c[i-][j],c[i-][j-]);
}
int main() {
scanf("%d%d%d",&n,&m,&k);
scanf("%s%s",a+,b+);
init();
dp[ind][][][]=;
fu(i,,n) {
ind^=;
memset(dp[ind],,sizeof(dp[ind]));
fu(j,,min(i,m))
fu(k,,j) {
dp[ind][j][k][]=add(dp[ind^][j][k][],dp[ind^][j][k][]);
if(k==||j==||a[i]!=b[j])continue;
dp[ind][j][k][]=add(dp[ind^][j-][k][],dp[ind^][j-][k-][]);
}
}
int ans=;
fu(i,,k)ans=add(ans,mul(add(dp[ind][m][i][],dp[ind][m][i][]),c[m-i][k-i]));
printf("%d",ans);
return ;
}
LOJ2424 NOIP2015 子串 【DP】*的更多相关文章
- $[NOIp2015]$ 子串 $dp$
\(Sol\) 不知道为啥看起来就很\(dp\)的亚子.我们关心的只有\(A\)串当前用到哪一个,\(B\)串已经匹配到哪个位置,已经匹配的被分成了多少段.所以设\(f_{i,j,k,0/1}\)表示 ...
- luogu2679 [NOIp2015]子串 (dp)
设f[i][j][k][b]表示在A串第i位.这是第j组.B串第k位.i号选不选(b=0/1) 那么就有$f[i][j][k][1]=(A[i]==B[k])*(f[i-1][j-1][k][0]+f ...
- NOIP2015子串[序列DP]
题目背景 无 题目描述 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重 叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一 个 ...
- P2679 子串 DP
P2679 子串 DP 从字符串A中取出\(k\)段子串,按原顺序拼接,问存在多少个方案使拼接的字符串与字符串B相同 淦,又是这种字符串dp 设状态\(ans[i][j][k]\)表示A串位置\(i\ ...
- [NOIP2015] 子串(dp)
题目描述 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一 个新的字符串,请问 ...
- NOIP2015 子串 (DP+优化)
子串 (substring.cpp/c/pas) [问题描述] 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个 互不重 叠 的非空子串,然后把这 k 个子串按照其在字 ...
- [DP][NOIP2015]子串
子串 题目描述 有两个仅包含小写英文字母的字符串 A 和 B. 现在要从字符串 A 中取出 k 个 互不重叠 的非空子串, 然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一个新的 ...
- NOIP2015 子串
#149. [NOIP2015]子串 有两个仅包含小写英文字母的字符串 AA 和 BB. 现在要从字符串 AA 中取出 kk 个互不重叠的非空子串,然后把这 kk 个子串按照其在字符串 AA 中出现的 ...
- 【uoj149】 NOIP2015—子串
http://uoj.ac/problem/149 (题目链接) 题意 给出两个字符串A.B,问从A中取出k个互不重叠的子串按顺序组成B的方案数. Solution 一看这种题目就是字符串dp,字符串 ...
随机推荐
- Restore IP Addresses,将字符串转换成ip地址
问题描述: Given a string containing only digits, restore it by returning all possible valid IP address c ...
- ZeroMq实现跨线程通信
ZeroMq实现跨线程通信 之前在技术崇拜的技术经理指导下阅读了ZeroMq的基础代码,现在就将阅读的心得与成果记录一下,并重新模仿实现了一下经理的异步队列. 1.对外接口 //主要接口(1)void ...
- 正确使用iOS常量(const)、enum以及宏(#define)
前言:本文主要梳理iOS中如何使用常量.enum.宏,以及各自的使用场景. 重要的事情首先说:在iOS开发中请尽量多使用const.enum来代替宏定义(#define):随着项目工程的逐渐增大,过多 ...
- Kafka消息文件存储
在对消息进行存储和缓存时,Kafka依赖于文件系统.(Page Cache) 线性读取和写入是所有使用模式中最具可预计性的一种方式,因而操作系统采用预读(read-ahead)和后写(write-be ...
- Stretch的Uniform和UniformToFill
通俗理解Stretch的Uniform和UniformToFill: Uniform,控件的高度和宽度会增加直到达到了容器的大小,也就是说控件的大小和容器的大小是有关系的,同时如果给控件设置了明确的高 ...
- hdu4009最小树形图
多建一个根,连到每一个点,然后花费是建水井的钱 然后跑一边最小树形图即可,这题必定有解,因为可以从根开始到每一点,可以不用判无解的情况 #include<map> #include< ...
- leetcode 559. Maximum Depth of N-ary Tree
Given a n-ary tree, find its maximum depth. The maximum depth is the number of nodes along the longe ...
- http请求的GET和POST请求:查询和新增(ajax)
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- nginx的编译,和简单的配置问题
反向代理常见的lvs.haproxy. 缓存服务常见的.squid.vanish.常见的前端缓存.Apache是多进程的web服务器,Nginx是多线程的web服务器. Nginx的特点,对静态能力强 ...
- hystrix 线程数,超时时间设置测试
拜读了大拿的文章,收藏起来 https://mp.weixin.qq.com/s?__biz=MzU0OTk3ODQ3Ng==&mid=2247483791&idx=1&sn= ...