• NOI2009 管道取珠


    题目链接:戳我

    对于处理方案数量平方的优化——可以看成两个人玩同一个游戏,他们输出序列一样的种类数。

    然后设f[i1][j1][i1][j2]为当前状态方案数量的平方和。(i1,i2表示第一个人上管道,下管道分别取出了i1,i2个,i2,j2表示第二个人)

    i1+j1=i2+j2,所以可以把最后一维去掉。然后加一个滚动数组可以进一步优化空间qwq。

    代码如下:

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #define MAXN 100010
    #define mod 1024523
    using namespace std;
    int n,m;
    int f[2][502][502];
    char a[502],b[502];
    int main()
    {
        #ifndef ONLINE_JUDGE
        freopen("ce.in","r",stdin);
        #endif
        scanf("%d%d",&n,&m);
        scanf("%s",a+1),reverse(&a[1],&a[n+1]);
        scanf("%s",b+1),reverse(&b[1],&b[m+1]);
        f[0][0][0]=1;
        for(int i1=0;i1<=n;i1++)
        {
            int kkk=i1&1;
            memset(f[kkk^1],0,sizeof(f[kkk^1]));
    		for(int j1=0;j1<=m;j1++)
            {
                for(int i2=0;i2<=n;i2++)
                {
                    int j2=i1+j1-i2;
                    if(j2<0||j2>m) continue;
                    if(a[i1+1]==a[i2+1]) f[kkk^1][j1][i2+1]=(f[kkk^1][j1][i2+1]+f[kkk][j1][i2])%mod;
                    if(a[i1+1]==b[j2+1]) f[kkk^1][j1][i2]=(f[kkk^1][j1][i2]+f[kkk][j1][i2])%mod;
                    if(b[j1+1]==a[i2+1]) f[kkk][j1+1][i2+1]=(f[kkk][j1+1][i2+1]+f[kkk][j1][i2])%mod;
                    if(b[j1+1]==b[j2+1]) f[kkk][j1+1][i2]=(f[kkk][j1+1][i2]+f[kkk][j1][i2])%mod;
                }
            }
        }
        printf("%d
    ",f[n&1][m][n]);
        return 0;
    }
    
    
  • 相关阅读:
    ASP.NET WebApi 中使用swagger 构建在线帮助文档
    TortoiseSVN 分支创建与合并
    C# 图片处理
    使用Vue构建单页应用一
    使用nuget 打包并上传 nuget.org
    SignalR 教程二 服务端广播
    SignalR 教程一
    Visual Studio 中常用的快捷键
    EF for Mysql
    Advanced Plugin Concepts
  • 原文地址:https://www.cnblogs.com/fengxunling/p/10366856.html
Copyright © 2020-2023  润新知