zoukankan      html  css  js  c++  java
  • BZOJ2423 HAOI2010最长公共子序列(动态规划)

      大讨论。注意去重。

    #include<iostream> 
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int read()
    {
        int x=0,f=1;char c=getchar();
        while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
        while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
        return x*f;
    }
    #define N 5010
    #define P 100000000
    int n,m,f[2][N],g[2][N];
    char a[N],b[N];
    int main()
    {
    #ifndef ONLINE_JUDGE
        freopen("bzoj2423.in","r",stdin);
        freopen("bzoj2423.out","w",stdout);
        const char LL[]="%I64d
    ";
    #else
        const char LL[]="%lld
    ";
    #endif
        char c=getchar();
        while (c>='A'&&c<='Z') a[++n]=c,c=getchar();
        a[++n]=c,c=getchar();
        while (c<'A'||c>'Z') c=getchar();
        while (c>='A'&&c<='Z') b[++m]=c,c=getchar();
        b[++m]=c,c=getchar();
        for (int j=0;j<=m;j++) g[0][j]=1;
        for (int i=1;i<=n;i++)
        {
            memset(f[i&1],0,sizeof(f[i&1]));
            memset(g[i&1],0,sizeof(g[i&1]));
            g[i&1][0]=1;
            for (int j=1;j<=m;j++)
            if (a[i]!=b[j])
            {
                f[i&1][j]=max(f[i&1^1][j],f[i&1][j-1]);
                if (f[i&1^1][j]==f[i&1][j-1])
                {
                    if (f[i&1^1][j]==f[i&1^1][j-1]) g[i&1][j]=((g[i&1^1][j]+g[i&1][j-1])%P-g[i&1^1][j-1]+P)%P;
                    else g[i&1][j]=(g[i&1^1][j]+g[i&1][j-1])%P;
                }
                else if (f[i&1^1][j]>f[i&1][j-1]) g[i&1][j]=g[i&1^1][j];
                else g[i&1][j]=g[i&1][j-1];
            }
            else
            {
                f[i&1][j]=f[i&1^1][j-1]+1;
                g[i&1][j]=g[i&1^1][j-1];
                if (f[i&1][j]==f[i&1^1][j]) g[i&1][j]=(g[i&1][j]+g[i&1^1][j])%P;
                if (f[i&1][j]==f[i&1][j-1]) g[i&1][j]=(g[i&1][j]+g[i&1][j-1])%P;
            }
        }
        cout<<f[n&1][m]-1<<endl<<g[n&1][m];
        return 0;
    }
  • 相关阅读:
    MongoDB快速入门教程 (4.1)
    MongoDB快速入门教程 (3.3)
    MongoDB快速入门教程 (3.2)
    MongoDB快速入门教程(3.1)
    MongoDB快速入门教程 (2)
    MongoDB快速入门教程 (1)
    express高效入门教程(5)
    刷过的题 分类汇总
    Binary Tree & Divide Conquer 完整笔记------part 2
    binary search完整笔记
  • 原文地址:https://www.cnblogs.com/Gloid/p/9571935.html
Copyright © 2011-2022 走看看