zoukankan      html  css  js  c++  java
  • bzoj1037: [ZJOI2008]生日聚会Party

    题目链接

    bzoj1037: [ZJOI2008]生日聚会Party

    题解

    dp[i][j][x][y] 有i个男生j个女生其中任意一段男生最多比女生多x个 女生最多比男生多y个
    注意一下边界...有点毒
    苟活者在淡红的血色中会依稀看到微茫的希望

    代码

    #include<bits/stdc++.h> 
    using namespace std; // 每天好心情从namespace开始 
    #define mod 12345678
    const int maxn = 157; 
    inline int read() { 
        int x = 0,f = 1;
        char c = getchar(); 
        while(c < '0' || c > '9'){if(c == '-')f = - 1;  c = getchar();}  
        while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = getchar(); 
        return x * f; 
    } 
    int dp[maxn][maxn][27][27]; 
    int n,m,k; 
    int main() { 
        n  = read(),m = read(),k = read(); 
        dp[0][0][0][0] = 1; 
        for(int i = 0;i <= n;++ i) 
            for(int j = 0;j <= m;++ j) 
                for(int l = 0;l <= std::min(i,k);++ l) 
                    for(int e = 0;e <= std::min(j,k);++ e) { 
                        if(i < n && l < k) dp[i + 1][j][l + 1][max(e - 1,0)] += dp[i][j][l][e]; 
                        if(j < m && e < k) dp[i][j + 1][max(l - 1,0)][e + 1] += dp[i][j][l][e]; 
                        dp[i + 1][j][l + 1][max(e - 1,0)] %= mod;
                        dp[i][j + 1][max(l - 1,0)][e + 1] %= mod; 
                    } 
        int ans = 0; 
        for(int i = 0;i <= k;++ i) 
            for(int j = 0;j <= k;++ j) ans += dp[n][m][i][j] , ans %= mod; 
        cout << ans << endl; 
        return 0; 
    }   
    
  • 相关阅读:
    【leetcode】对称二叉树
    【leetcode】判断回文数
    053686
    053685
    053684
    053683
    053682
    053681
    053680
    053477
  • 原文地址:https://www.cnblogs.com/sssy/p/9337802.html
Copyright © 2011-2022 走看看