您的位置:首页 > 其它

1037: [ZJOI2008]生日聚会Party dp

2017-06-30 18:30 274 查看
Description

  今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party。 hidadz带着朋友们来到花园中,打算

坐成一排玩游戏。为了游戏不至于无聊,就座的方案应满足如下条件:对于任意连续的一段,男孩与女孩的数目之

差不超过k。很快,小朋友便找到了一种方案坐了下来开始游戏。hidadz的好朋友Susie发现,这样的就座方案其实

是很多的,所以大家很快就找到了一种,那么到底有多少种呢?热爱数学的hidadz和她的朋友们开始思考这个问题

…… 假设参加party的人中共有n个男孩与m个女孩,你是否能解答Susie和hidadz的疑问呢?由于这个数目可能很

多,他们只想知道这个数目除以12345678的余数。

Input

  仅包含一行共3个整数,分别为男孩数目n,女孩数目m,常数k。

Output

  应包含一行,为题中要求的答案。

Sample Input

1 2 1

Sample Output

1

dp[i][j][x][y]表示到第i个人时有j个男生且男生比女生多x个女生比男生多y个的情况个数。

如果第i+1个人可以是男生则 dp[i + 1][j + 1][x + 1][max(y - 1, 0)] += dp[i][j][x][y]

如果第i+1个人可以是女生则 dp[i + 1][j][max(x - 1, 0)][y + 1] += dp[i][j][x][y]

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int mod = 12345678;
int dp[305][155][22][22];
int main()
{
int n, i, j, k, sum, m, x, y, ans = 0;
dp[0][0][0][0] = 1;
scanf("%d%d%d", &n, &m, &k);
for (i = 0;i < n + m;i++)
{
for (j = 0;j <= n;j++)
for (x = 0;x <= k;x++)
for (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(y - 1, 0)] += dp[i][j][x][y] % mod;
if (i + 1 - j <= m&&y + 1 <= k) dp[i + 1][j][max(x - 1, 0)][y + 1] += dp[i][j][x][y] % mod;
}
}
for (i = 0;i <= k;i++)
{
for (j = 0;j <= k;j++)
ans += dp[n + m]
[i][j], ans %= mod;
}
printf("%d\n", ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: