P2679 子串
Posted ukcxrtjr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2679 子串相关的知识,希望对你有一定的参考价值。
题面:https://www.luogu.org/problem/P2679
本题设f[i][p]为到i位置选了p个子串的方案数,g[i][p]为从上一个子串结束位置到i位置选了p个子串的方案数.
则当a[i]!=b[j]时,g[j][p]=0;
当a[i]==b[j]时,g[i][p]=g[i-1][p]+f[i-1][p-1](注意:这里就是为了把当前正在处理的这个子串给连起来)
f[i][p]=f[i][p]+g[i][p]
Code:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=205,mod=1e9+7;
int n,m,k,f[N][N],g[N][N];
char a[N*5],b[N];
int main(){
scanf("%d%d%d%s%s",&n,&m,&k,a+1,b+1);
f[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=m;j>=1;j--){
for(int p=k;p>=1;p--){
if(a[i]!=b[j]){
g[j][p]=0;
continue;
}
g[j][p]=(g[j-1][p]+f[j-1][p-1])%mod;
f[j][p]=(f[j][p]+g[j][p])%mod;
}
}
}
printf("%d
",f[m][k]);
return 0;
}
以上是关于P2679 子串的主要内容,如果未能解决你的问题,请参考以下文章