P2679 子串

Posted popo-black-cat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2679 子串相关的知识,希望对你有一定的参考价值。

  这题真不错,需要三维dp,转移方程为我好久才想出来。

  然后发现数组开不下……

  emmm……

  于是乎我看了题解,才想起来我会滚动数组,,,qwq

  这道题的关键就是,对于这个第 i 位是和上一个合并还是单独新开一个串,那么对于上述两种情况,就要对应必须选第 i 个或者第 i 个可选可不选(即现有最优解)。

  代码如下:

#include<cstdio>
#include<iostream>
using namespace std;
#define mod 1000000007
int n,m,k,now,pre;
int ans[3][1005][1005],res[3][1005][1005];
char a[1005],b[1005];
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    scanf("%s%s",a+1,b+1);
    ans[0][0][0]=1,now=1,pre=0;
    for(int i=1;i<=n;i++)
    {
        ans[now][0][0]=1;
        for(int j=1;j<=m;j++)
        for(int p=1;p<=k;p++)
        {
            if(a[i]==b[j])
            res[now][j][p]=(res[pre][j-1][p]+ans[pre][j-1][p-1])%mod;
            else                        
            res[now][j][p]=0;            
            ans[now][j][p]=(res[now][j][p]+ans[pre][j][p])%mod;
        }
        pre=now;
        now^=1;
    }
    printf("%d",ans[now^1][m][k]);
    return 0;
}

  dp代码就是短小精悍啊~

  

以上是关于P2679 子串的主要内容,如果未能解决你的问题,请参考以下文章

P2679 子串

P2679 子串

洛古 P2679 子串 题解

P2679 子串

Luogu P2679 子串(字符串+dp)

P2679 子串