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; 
}   
posted @ 2018-07-19 19:12  zzzzx  阅读(590)  评论(2编辑  收藏  举报