zoukankan      html  css  js  c++  java
  • P2679 子串

    传送门

    十分显然的DP

    设 f [ i ] [ j ] [ k ] [ 1/0 ] 表示当前考虑到 A 串第 i 位,匹配到 B 串第 j 位,已经划分了 k 分,当前为 选 or 不选

    如果 A [ i ] ≠ B [ j ] 那么当前位不能选,则只有一个转移 f [ i ] [ j ] [ k ] [ 0 ] = f [ i-1 ] [ j ] [ k ] [ 0 ] + f [ i-1 ] [ j ] [ k ] [ 1 ]

    如果 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 ]

    注意转移时如果上一位也有选,那么当前位可以与上一位合并也可以不合并,单独分出一位

    注意空间完全不够,所以要滚动数组优化掉 i 

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    inline int read()
    {
        int x=0,f=1; char ch=getchar();
        while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
        while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
        return x*f;
    }
    const int N=1007,M=207,mo=1e9+7;
    
    inline int fk(int x) { return x>=mo ? x-mo : x; }//这样取余比较快
    int n,m,t;
    char sa[N],sb[M];
    int f[2][M][M][2];
    int main()
    {
        n=read(); m=read(); t=read();
        scanf("%s",sa+1); scanf("%s",sb+1);
        f[0][0][0][0]=1;
        for(int i=1;i<=n;i++)
            for(int j=0;j<=m;j++)
                for(int k=0;k<=t;k++)
                {
                    f[i&1][j][k][0]=fk( f[(i-1)&1][j][k][0]+f[(i-1)&1][j][k][1] );
                    if(j&&k&&sa[i]==sb[j])//要注意此时j,k不能为0
                        f[i&1][j][k][1]=fk( f[(i-1)&1][j-1][k][1]+ fk(f[(i-1)&1][j-1][k-1][0]+f[(i-1)&1][j-1][k-1][1]) );
                    else f[i&1][j][k][1]=0;//因为是滚动数组,所以注意如果不能选一定要记得把值赋为0
                }
        printf("%d",fk( f[n&1][m][t][0]+f[n&1][m][t][1] ));
        return 0;
    }
  • 相关阅读:
    企业应用的互联网化
    企业应用开发平台GAP平台
    技术有什么用?
    Samba服务器配置
    IT从业人员需要知道的10个小秘密
    在雪豹10.6.2(Mac OS X)上安装Oracle10g
    项目经理的职责
    通过堡垒机远程连接Windows Server
    MySQL:Data truncated for column 'last_apply_time' at row 1
    当有莫名其妙的错误里, 可以
  • 原文地址:https://www.cnblogs.com/LLTYYC/p/9822850.html
Copyright © 2011-2022 走看看