BZOJ 1037: [ZJOI2008]生日聚会Party( dp )

dp(i, j, a, b)表示选了i个男生, j个女生, 后缀中男生比女生多a(最多), 女生比男生多b(最多).

dp(i+1, j, a+1, max(0, b-1)) += dp(i, j, a, b)

dp(i, j+1, max(0, a-1), b+1) += dp(i, j, a, b)

时间复杂度O(NMK^2)

-------------------------------------------------------------------------------------

#include<cstdio>

#include<cstring>

#include<algorithm>

using namespace std;

const int maxn = 159;

const int maxk = 29;

const int MOD = 12345678;

int dp[maxn][maxn][maxk][maxk];

int B, G, K;

inline void upd(int &x, int t) {

if((x += t) >= MOD)

x -= MOD;

}

int main() {

scanf("%d%d%d", &B, &G, &K);

memset(dp, 0, sizeof dp);

dp[0][0][0][0] = 1;

for(int i = 0; i <= B; i++)

for(int j = 0; j <= G; j++)

for(int a = 0; a <= K; a++)

for(int b = 0; b <= K; b++) {

upd(dp[i + 1][j][a + 1][max(0, b - 1)], dp[i][j][a][b]);

upd(dp[i][j + 1][max(0, a - 1)][b + 1], dp[i][j][a][b]);

}

int ans = 0;

for(int a = 0; a <= K; a++)

for(int b = 0; b <= K; b++)

upd(ans, dp[B][G][a][b]);

printf("%d\n", ans);

return 0;

}

-------------------------------------------------------------------------------------

1037: [ZJOI2008]生日聚会Party

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1785  Solved: 1058
[Submit][Status][Discuss]

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

HINT

对于100%的数据, n , m ≤ 150,k ≤ 20。

Source

时间: 2024-08-28 18:43:06

BZOJ 1037: [ZJOI2008]生日聚会Party( dp )的相关文章

BZOJ 1037: [ZJOI2008]生日聚会Party 四维DP

1037: [ZJOI2008]生日聚会Party Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1650  Solved: 971[Submit][Status][Discuss] Description 今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party. hidadz带着朋友们来到花园中,打算坐成一排玩游戏.为了游戏不至于无聊,就座的方案应满足如下条件:对于任意连续的一段,男孩与女孩的数目之差不超过k.很快,小朋友便找

[BZOJ 1037][ZJOI2008]生日聚会Party

1037: [ZJOI2008]生日聚会Party Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2560  Solved: 1538[Submit][Status][Discuss] Description 今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party. hidadz带着朋友们来到花园中,打算坐成一排玩游戏.为了游戏不至于无聊,就座的方案应满足如下条件:对于任意连续的一段,男孩与女孩的数目之差不超过k.很快,小朋友便

BZOJ 1037 [ZJOI2008]生日聚会Party(单调DP)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1037 [题目大意] 现在有n个男生,m个女生排成一行,要求不存在一个区间男女之差大于k,求方案数. [题解] 因为求方案数,我们考虑到一种类似于背包问题求方案数的dp方法,dp[i][j][u][v]表示男生i个女生j个,男比女多u个,女比男多v个的方案数,在统计数注意越界的情况就好. [代码] #include <cstdio> #include <algorithm>

bzoj 1037 [ZJOI2008]生日聚会Party(DP)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1037 [题意] 一排n男m女,求满足任意连续段男女人数之差不超过k的数目. [思路] DP 设f[a][b][c][d]表示a男m女,男生女生人数最大差为c,女生男生人数最大差为d的方案数,则有转移方程: f[a+1][b][c+1][max(d-1,0)]<-f[a][b][c][d] f[a][b+1][max(c-1,0)][d+1]<-f[a][b][c][d] 太神辣 -

[luogu2592 ZJOI2008] 生日聚会 (计数dp)

题目描述 今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party. hidadz带着朋友们来到花园中,打算坐成一排玩游戏.为了游戏不至于无聊,就座的方案应满足如下条件: 对于任意连续的一段,男孩与女孩的数目之差不超过k. 很快,小朋友便找到了一种方案坐了下来开始游戏.hidadz的好朋友Susie发现,这样的就座方案其实是很多的,所以大家很快就找到了一种,那么到底有多少种呢?热爱数学的hidadz和她的朋友们开始思考这个问题-- 假设参加party的人中共有n个男孩与m个女孩,

1037: [ZJOI2008]生日聚会Party

1821: [JSOI2010]Group 部落划分 Group Description 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成为谜团了——聪聪根本就不知道部落究竟是如何分布的. 不过好消息是,聪聪得到了一份荒岛的地图.地图上标注了N个野人居住的地点(可以看作是平面上的坐标).我们知道,同一个部落的野人总是生活在附近.我们把两个部落的距离,定义为部落中距离最近

bzoj千题计划125:bzoj1037: [ZJOI2008]生日聚会Party

http://www.lydsy.com/JudgeOnline/problem.php?id=1037 一个区间是否满足 任意连续的一段,男孩与女孩的数目之差不超过k, 取决于男孩与女孩数目之差的最大值是否满足条件 而且若在一个位置 上坐一个男孩, 所有包含这个位置的区间 男孩与女孩数目之差+1,与女孩与男孩数目之差-1 所以我们只需要知道 最大的数目 之差即可 dp[i][j][k][l] 表示前i个位置,坐了j个男孩,男孩与女孩数目之差=k,女孩与男孩数目之差=l 的方案数 k<0 怎么办

[ZJOI2008]生日聚会Party

1037: [ZJOI2008]生日聚会Party Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2907  Solved: 1727[Submit][Status][Discuss] Description 今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party. hidadz带着朋友们来到花园中,打算坐成一排玩游戏.为了游戏不至于无聊,就座的方案应满足如下条件:对于任意连续的一段,男孩与女孩的数目之差不超过k.很快,小朋友便

bzoj1037[ZJOI2008]生日聚会

bzoj1037[ZJOI2008]生日聚会 题意: 一排小孩坐着玩游戏.就座的方案满足如下条件:对于任意连续的一段,男孩与女孩的数目之差不超过k.给出男孩数,女孩数和k,求就座方案数除以12345678的余数. 题解: dp方程见程序,i1i2表示当前选了几男几女,i3i4分别表示当前男比女多几个和女比男多几个. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define