【ZJOI 2008】 生日聚会

时间:2023-03-09 19:48:02
【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 = ; 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[][][][] = ;
for (i = ; i <= n; i++)
{
for (j = ; j <= m; j++)
{
for (x = ; x <= k; x++)
{
for (y = ; y <= k; y++) {
if (i + <= n && x + <= k)
{
f[i+][j][x+][max(,y-)] += f[i][j][x][y];
f[i+][j][x+][max(,y-)] %= MOD;
}
if (j + <= m && y + <= k)
{
f[i][j+][max(x-,)][y+] += f[i][j][x][y];
f[i][j+][max(x-,)][y+] %= MOD;
}
}
}
}
} for (i = ; i <= k; i++)
{
for (j = ; j <= k; j++)
{
ans += f[n][m][i][j];
ans %= MOD;
}
} printf("%d\n",ans); return ; }