zoukankan      html  css  js  c++  java
  • [BZOJ 1037] 生日聚会Party

    Link:

    BZOJ 1037 传送门

    Solution:

    由于对任意一段都有要求,于是我们对于所有前缀考虑其后缀不超过$k $即可:

    设$dp[i][j][x][y]$为前$i$个人中有$j$个男孩,且后缀中男女最大相差$x$,女男最大相差$y$时的方案数

    每次向添加女孩/添加男孩转移。

    注意:如果差值为负数时置为$0$,因为无论差了多少,在下一次添加相同性别时最大相差都会变为$1$

    Code:

    #include <bits/stdc++.h>
    
    using namespace std;
    const int MOD=12345678;
    const int MAXN=155;
    int dp[2*MAXN][MAXN][25][25],n,m,k,res=0;
    
    int main()
    {
        scanf("%d%d%d",&n,&m,&k);dp[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(dp[i][j][x][y])
        {
            if(j+1<=n && x+1<=k) (dp[i+1][j+1][x+1][max(0,y-1)]+=dp[i][j][x][y])%=MOD;
            if(y+1<=k && i+1-j<=m) (dp[i+1][j][max(0,x-1)][y+1]+=dp[i][j][x][y])%=MOD;
        }
        for(int i=0;i<=n;i++) for(int j=0;j<=k;j++) for(int x=0;x<=k;x++)
            (res+=dp[n+m][i][j][x])%=MOD;
        printf("%d",res);
        return 0;
    }

    Review:

    (1)如果转移为向后添加数时,一般用已知数向后转移未知数更方便,而非未知数反推已知数

    (2)如果对“任意一段”有要求时,转移时保证每一个前缀的最差后缀都合法即可

  • 相关阅读:
    QAU 18校赛 J题 天平(01背包 判断能否装满)
    滚动数组
    Leapin' Lizards HDU
    Sabotage UVA
    Food HDU
    两个Button 加通一个手势,那么 第一个的就失效了,
    终于把聊天记录保存到数据库当中去了,
    添加好友,
    XEP 0055 (Jabber search) with iphone SDK
    手机ip,
  • 原文地址:https://www.cnblogs.com/newera/p/9157648.html
Copyright © 2011-2022 走看看