【ZJOI 2008】 生日聚会
【题目链接】
【算法】
动态规划
f[i][j][x][y]表示当前选了i个男生,j个女生,男生与女生差最大为x,女生与男生差最大为y的方案数
转移很显然,笔者不再赘述
【代码】
#include<bits/stdc++.h> using namespace std; #define MAXN 155 #define MAXK 25 const int MOD = 12345678; int n,m,k,i,j,x,y,ans; int f[MAXN][MAXN][MAXK][MAXK]; int main() { scanf("%d%d%d",&n,&m,&k); f[0][0][0][0] = 1; for (i = 0; i <= n; i++) { for (j = 0; j <= m; j++) { for (x = 0; x <= k; x++) { for (y = 0; y <= k; y++) { if (i + 1 <= n && x + 1 <= k) { f[i+1][j][x+1][max(0,y-1)] += f[i][j][x][y]; f[i+1][j][x+1][max(0,y-1)] %= MOD; } if (j + 1 <= m && y + 1 <= k) { f[i][j+1][max(x-1,0)][y+1] += f[i][j][x][y]; f[i][j+1][max(x-1,0)][y+1] %= MOD; } } } } } for (i = 0; i <= k; i++) { for (j = 0; j <= k; j++) { ans += f[n][m][i][j]; ans %= MOD; } } printf("%d\n",ans); return 0; }