NOIP2015 子串

来源:互联网 发布:做x展架用什么软件 编辑:程序博客网 时间:2024/06/05 17:13

Problem

偷个懒不会被发现的吧
NOIP的题目到处都找的到,我就不写了~~

Solution

思维难度还是有点高的哇……反正这个dp方程我是实在没推出来。
用f[j][k]表示取到a[i]位时,在b的前j位取k个子串的方案数;g[j][k]表示a的前i位,在b的前j位,取k个子串的方案数。状态转移方程见下。
代码奇短无比,这里用了一点降维的优化,将j倒着循环就可以实现滚动数组。

Code

#include <iostream>#include <cstdio>using namespace std;const int maxn=1010,maxm=210,mod=1e9+7;int n,m,k,f[maxm][maxm],g[maxm][maxm];string a,b;int main(){    scanf("%d %d %d\n",&n,&m,&k);    cin>>a>>b;    f[0][0]=g[0][0]=1;    for(int i=1;i<=n;i++)      for(int j=m;j>=1;j--)        for(int r=1;r<=k;r++)        {            if(a[i-1]!=b[j-1])            {                f[j][r]=0;                continue;            }            f[j][r]=(f[j-1][r]%mod+g[j-1][r-1]%mod)%mod;            g[j][r]=(f[j][r]%mod+g[j][r]%mod)%mod;        }    printf("%d\n",g[m][k]);    return 0;}
原创粉丝点击