码迷,mamicode.com
首页 > 其他好文 > 详细

NOIP2015Day2T2子串(字符串dp)

时间:2017-03-04 22:25:45      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:amp   ted   并且   lock   main   std   code   define   blog   

  又被“if(a=b)”坑了QAQ。。。写C++还是得开Warning,这么久了pascal还没改过来咋回事啊QWQ

  题目大意就不说了OWO

  网上的题解都不怎么看得懂啊。。。好像写得都很乱?还是我太sb了

  f[i][j][k][0]表示A串前i个字符和B串前j个字符能够匹配,并且分成k段,a[i]不选。f[i][j][k][1]同理但a[i]要选。

  于是。。。f[i][j][k][0]=f[i-1][j][k][1]+f[i-1][j][k][0];

       if(a[i]==b[j])f[i][j][k][1]=f[i-1][j-1][k-1][0]+f[i-1][j-1][k][1]+f[i-1][j-1][k-1][1];

  ①第一维滚动②取模太慢了,学习CZL使用“x>=mod?x-mod:x”的小妓巧。

技术分享
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#define mod 1000000007
using namespace std;
char a[1010],b[510];
int n,m,K,cnt,ans,f[2][1010][210][2];
int main()
{
    scanf("%d%d%d",&n,&m,&K);
    scanf("%s",a+1);scanf("%s",b+1);
    for(int i=1;i<=n;i++)
    {
        f[i&1][1][1][0]=cnt;
        if(a[i]==b[1])f[i&1][1][1][1]=1,cnt++;
        for(int j=2;j<=m;j++)
        for(int k=1;k<=K;k++)
        {
            int x=f[(i+1)&1][j][k][1]+f[(i+1)&1][j][k][0];
            f[i&1][j][k][0]=x>=mod?x-mod:x;
            if(a[i]==b[j])
            {
                int x=f[(i+1)&1][j-1][k][1]+f[(i+1)&1][j-1][k-1][1];
                int y=x>=mod?x-mod:x;
                f[i&1][j][k][1]=y+f[(i+1)&1][j-1][k-1][0]>=mod?y+f[(i+1)&1][j-1][k-1][0]-mod:y+f[(i+1)&1][j-1][k-1][0];
            }
        }
        for(int j=1;j<=m;j++)
        for(int k=1;k<=K;k++)
        f[(i+1)&1][j][k][1]=f[(i+1)&1][j][k][0]=0;
    }
    ans=f[n&1][m][K][1]+f[n&1][m][K][0];
    printf("%d\n",ans>=mod?ans-mod:ans);
}
View Code

 

 

NOIP2015Day2T2子串(字符串dp)

标签:amp   ted   并且   lock   main   std   code   define   blog   

原文地址:http://www.cnblogs.com/Sakits/p/6502660.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!