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\n",f[m][k]);
    return 0;
}
posted @ 2019-09-30 06:44  prestige  阅读(98)  评论(0编辑  收藏  举报