Luogu P2679 [NOIp提高组2015]子串
2017-08-14 13:43
239 查看
题目描述
有两个仅包含小写英文字母的字符串 A 和 B。现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一 个新的字符串,请问有多少种方案可以使得这个新串与字符串 B 相等?注意:子串取出 的位置不同也认为是不同的方案。
设d(i,j,k)表示字符串A前i个字符取出k个子串组成字符串B的前j个字符的方案数。
设f(i,j,k)表示如果A[i]==b[j]且必须取A[i],值为字符串A前…方案数(同上),否则为0。
首先d(i,j,k)=d(i−1,j,k)
如果A[i]!=B[j]f(i,j,k)=0
否则{
我们可以单独取出A[i]和B[j]匹配d(i,j,k)+=d(i−1,j−1,k−1)且f(i,j,k)=d(i−1,j−1,k−1)
如果A[i-1]==B[j-1]我们还可以取出每一个以A[i]结尾的串和以B[i]结尾的串匹配。d(i,j,k)+=f(i−1,j−1,k)且f(i,j,k)+=f(i−1,j−1,k)
}
再用滚动数组优化。
有两个仅包含小写英文字母的字符串 A 和 B。现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一 个新的字符串,请问有多少种方案可以使得这个新串与字符串 B 相等?注意:子串取出 的位置不同也认为是不同的方案。
设d(i,j,k)表示字符串A前i个字符取出k个子串组成字符串B的前j个字符的方案数。
设f(i,j,k)表示如果A[i]==b[j]且必须取A[i],值为字符串A前…方案数(同上),否则为0。
首先d(i,j,k)=d(i−1,j,k)
如果A[i]!=B[j]f(i,j,k)=0
否则{
我们可以单独取出A[i]和B[j]匹配d(i,j,k)+=d(i−1,j−1,k−1)且f(i,j,k)=d(i−1,j−1,k−1)
如果A[i-1]==B[j-1]我们还可以取出每一个以A[i]结尾的串和以B[i]结尾的串匹配。d(i,j,k)+=f(i−1,j−1,k)且f(i,j,k)+=f(i−1,j−1,k)
}
再用滚动数组优化。
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; const int mo=1e9+7; int d[210][210],f[210][210]; int main(){ int n,m,u; char s1[1010],s2[210]; cin>>n>>m>>u>>s1+1>>s2+1; d[0][0]=1; for(int i=1;i<=n;i++) for(int j=m;j>0;j--) for(int k=u;k>0;k--){ if(s1[i]==s2[j]){ d[j][k]=(d[j][k]+d[j-1][k-1])%mo; f[j][k]=d[j-1][k-1]; if(s1[i-1]==s2[j-1]){ d[j][k]=(d[j][k]+f[j-1][k])%mo; f[j][k]=(f[j][k]+f[j-1][k])%mo; } } else f[j][k]=0; } cout<<d[m][u]<<endl; return 0; }
相关文章推荐
- 【NOIP2015提高组Day2】子串
- 【NOIP2015提高组T5】子串-字符串上的动态规划
- C++——NOIP2015提高组day2 t2——子串
- NOIP2015复赛提高组day2(A:跳石头 B:子串 C:运输计划)
- NOIP2015提高组Day2 第二题 子串 解题报告
- 4000 NOIP 2015 提高组 Day2 子串
- NOIP2015提高组Day2 子串
- [NOIP2015] 提高组 洛谷P2679 子串
- [NOIP2015提高组]子串 DP
- 【NOIP】提高组2015 子串
- NOIP2015提高组T2 子串
- 洛谷P2679 NOIP2015 子串
- NOIP2015复赛提高组day1(A:神奇的幻方 B:信息传递 C:斗地主)
- JZOJsenior4325、luoguP2668.【NOIP2015提高组Day1】斗地主
- NOIP2015 子串
- NOIP2015提高组 信息传递(图论)
- NOIP 2015 提高组 day2 解题报告
- NOIP 2015 子串 (DP)
- 洛谷Luogu-267 跳石头(NOIP提高组2015 day2 t1)(二分答案) HQG_AC的博客
- noip 2015 提高组 跳石头