zoukankan      html  css  js  c++  java
  • bzoj1037

    一道MLE的DP,我们设f[i][j][x][y]表示一共i个人j个男生,男生比女生多x个,女生比男生多y个。递推

    如果x+1<k,f[i+1,j+1,x+1,max(y-1,0)]+=f[i][j][x][y]

    如果y+1<k,f[i+1,j,max(x-1,0),y+1]+=f[i][j][x][y]

    最后统计答案,不要忘了取膜

    #include <stdio.h>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    #include <queue>
    #include <vector>
    using namespace std;
    const int lxn=12345678;
    int n,m,k,ans;
    int f[301][151][21][21]; 
    template <class T> void read(T&x)
    {
      x=0;char c=getchar();int f=0;
      while(c<'0'||c>'9'){f|=(c=='-');c=getchar();}
      while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^=48),c=getchar();
      x=f?-x:x;
    }
    int main()
    { 
      read(n);read(m);read(k);
      f[0][0][0][0]=1;
      for(int i=0;i<n+m;i++)
       for(int j=0;j<=n;j++)
        for(int x=0;x<=k;x++)
         for(int y=0;y<=k;y++)
         {
           if(x+1<=k&&j+1<=n)
           {
                f[i+1][j+1][x+1][max(y-1,0)]+=f[i][j][x][y];
                f[i+1][j+1][x+1][max(y-1,0)]%=lxn;
           }
           if(y+1<=k&&i+1-j<=m)
           {
                f[i+1][j][max(x-1,0)][y+1]+=f[i][j][x][y];
                f[i+1][j][max(x-1,0)][y+1]%=lxn;
           }
         }
      int ans=0;
      for(int i=0;i<=n;i++)
       for(int x=0;x<=k;x++)
        for(int y=0;y<=k;y++)
        {
          ans+=f[n+m][i][x][y];
          ans%=lxn;
        }
      printf("%d",ans);
      return 0;
    }
    View Code
  • 相关阅读:
    AOP面向方面编程
    Struts2基于注解的Action配置
    地图api汇总
    Visual C++ 嵌入汇编代码
    C# ASP.net中用到的JWT身份验证
    Asp.Net Forms 身份验证
    .Net 面试常见问题
    Web Api 自动生成帮助文档
    .Net常见的一些区别
    创建Silverlight 5浏览器内受信应用
  • 原文地址:https://www.cnblogs.com/new-hand/p/7777978.html
Copyright © 2011-2022 走看看