zoukankan      html  css  js  c++  java
  • bzoj1037

    题解:

    定义f[i][j][a][b]表示已经排了i个人

    还能拍j个男的(那么就还有m-i+j个是女的)

    还能连续拍a个男的,b个女的

    我是递推的

    考虑后面一个拍男的还是女的

    注意要判断边界

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=155,K=23,M=12345678;
    int n,m,k,f[2*N][N][K][K];
    int main()
    {
        scanf("%d%d%d",&n,&m,&k);
        f[1][n-1][k-1][k]=f[1][n][k][k-1]=1;
        for (int i=1;i<n+m;i++)
         for (int j=0;j<=n;j++)
          for (int a=0;a<=k;a++)
           for (int b=0;b<=k;b++)
            {
                if (j!=0&&a!=0)(f[i+1][j-1][a-1][min(k,b+1)]+=f[i][j][a][b])%=M;
                if (j!=n+m-i&&b!=0)(f[i+1][j][min(k,a+1)][b-1]+=f[i][j][a][b])%=M;
            }
        int ans=0;    
        for (int a=0;a<=k;a++)
         for (int b=0;b<=k;b++)
          (ans+=f[n+m][0][a][b])%=M;
        printf("%d
    ",ans);
        return 0;     
    }
  • 相关阅读:
    常用模块Part(1)
    递归函数
    python 生成器函数
    python 迭代器与生成器
    python 函数进阶
    python 装饰器进阶
    python time模块
    python 初始函数
    python 文件操作
    python 一些小知识
  • 原文地址:https://www.cnblogs.com/xuanyiming/p/8039329.html
Copyright © 2011-2022 走看看