1037: [ZJOI2008]生日聚会Party dp

来源:互联网 发布:mac战网国服改台服 编辑:程序博客网 时间:2024/05/18 17:23
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][n][i][j], ans %= mod;}printf("%d\n", ans);return 0;}


原创粉丝点击