题目描述

今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party。 hidadz带着朋友们来到花园中,打算坐成一排玩游戏。为了游戏不至于无聊,就座的方案应满足如下条件:

对于任意连续的一段,男孩与女孩的数目之差不超过k。

很快,小朋友便找到了一种方案坐了下来开始游戏。hidadz的好朋友Susie发现,这样的就座方案其实是很多的,所以大家很快就找到了一种,那么到底有多少种呢?热爱数学的hidadz和她的朋友们开始思考这个问题……

假设参加party的人中共有n个男孩与m个女孩,你是否能解答Susie和hidadz的疑问呢?由于这个数目可能很多,他们只想知道这个数目除以12345678的余数。

输入输出格式

输入格式:

输入文件party.in仅包含一行共3个整数,分别为男孩数目n, 女孩数目m, 常数k。

输出格式:

输出文件party.out应包含一行,为题中要求的答案。

输入输出样例

输入样例#1:

1 2 1

输出样例#1:

1

说明

对于30%的数据,n , m ≤ 20;

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


四维dp,dp[i][j][x][y] 表示选了i个人,j个是男生,这段中男生最多比女生多x个,女生最多比男生多y个。

转移方程:

dp[i+1][j+1][x+1][max(y-1),0]+=dp[i][j][x][y];(x <k && j<n)

dp[i+1][j][max(x-1,0)][y+1]+=dp[i][j][x][y]; (y < k && i-j< m)

#include<bits/stdc++.h>

using namespace std;
const int MAXN = 155;
const int mod = 12345678; int n,m,k,dp[MAXN*2][MAXN][21][21],ans; int main(){
scanf("%d%d%d",&n,&m,&k);
dp[0][0][0][0]=1;
for(register int i=0;i<n+m;i++)
for(register int j=0;j<=n;j++) {
if(j>i) break;
int g=i-j;
for(register int x=0;x<=k;x++)
for(register int y=0;y<=k;y++){
if(!dp[i][j][x][y]) continue;
if(x+1<=k && j+1<=n)
dp[i+1][j+1][x+1][max(0,y-1)]+=dp[i][j][x][y];
if(y+1<=k && g+1<=m)
dp[i+1][j][max(0,x-1)][y+1]+=dp[i][j][x][y];
dp[i+1][j+1][x+1][max(0,y-1)]%=mod;
dp[i+1][j][max(x-1,0)][y+1]%=mod;
}
}
for(register int i=0;i<=k;i++)
for(register int j=0;j<=k;j++)
ans+=dp[n+m][n][i][j],ans%=mod;
printf("%d",ans);
return 0;
}

BZOJ 1037 (ZJOI 2008) 生日聚会的更多相关文章

  1. 【BZOJ 1037】[ZJOI2008]生日聚会Party

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1037 [题意] [题解] /* 设f[i][j][k][l] 表示前i个人中,有j个男 ...

  2. [ZJOI]2008 生日聚会

    显然DP. 将题目转化下: 求由n个0.m个1组成,且满足任意子串0的数量和1的数量差绝对值不超过k的01串数量.n, m≤150,k≤20. 直接做没什么思路,,那我们尽量利用题目的时间和空间限制, ...

  3. BZOJ 1040 ZJOI 2008 骑士 基环树林+树形DP

    题目大意:有一些骑士.他们每个人都有一个权值.可是因为一些问题,每个骑士都特别讨厌还有一个骑士.所以不能把他们安排在一起.求这些骑士所组成的编队的最大权值和是多少. 思路:首先貌似是有向图的样子,可是 ...

  4. BZOJ 1040 ZJOI 2008 骑士 树形DP

    题意: 有一些战士,他们有战斗力和讨厌的人,选择一些战士,使他们互不讨厌,且战斗力最大,范围1e6 分析: 把战士看作点,讨厌的关系看作一条边,连出来的是一个基环树森林. 对于一棵基环树,我们找出环, ...

  5. bzoj 1034 [ ZJOI 2008 ] 泡泡堂BNB —— 贪心

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1034 一开始想了个很麻烦的贪心做法,对于每个 a[i],找第一个大于它的 b 匹配…… 然后 ...

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

    1037: [ZJOI2008]生日聚会Party Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1583  Solved: 936[Submit][ ...

  7. 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, ...

  8. BZOJ 1037: [ZJOI2008]生日聚会Party [序列DP]

    1037: [ZJOI2008]生日聚会Party Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2249  Solved: 1337[Submit] ...

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

    1037: [ZJOI2008]生日聚会Party Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1650  Solved: 971[Submit][ ...

  10. 【BZOJ】【1037】【ZJOI2008】生日聚会party

    DP orz iwtwiioi 这种题居然是DP……原来统计方案数是可以用动态规划来做的啊= =用一些变量来维护一些信息,保证方案可行性/合法性 人太弱实在是有些忧伤…… /************* ...

随机推荐

  1. usleep - 睡眠若干微秒

    总览 (SYNOPSIS) usleep [number] 描述 (DESCRIPTION) usleep 睡眠 指定的 微秒数. 缺省值 是 1. 选项 (OPTIONS) --usage 显示 简 ...

  2. Spring:DataSource注入到dao

    Spring:DataSource注入到dao 使用DOS命令创建数据库(Mysql) CREATE DATABASE book DEFAULT CHARACTER SET utf8; CREATE ...

  3. SQLServer2008上的SDE备份和还原

    一.备份 右键数据库>任务>备份.选择完整模式,导出为xxx.bak文件即可. 二.还原 1.创建sde用户名,新建同名数据库xxx,并指定sde为xxx的拥有者. 2.在master上创 ...

  4. javabean 深拷贝

    <!-- https://mvnrepository.com/artifact/uk.com.robust-it/cloning --> <dependency> <gr ...

  5. leetcode-159周赛-5231-删除子文件夹

    题目描述: 自己的提交: class Solution: def removeSubfolders(self, folder: List[str]) -> List[str]: d = {} r ...

  6. 通过网络socket获取对方 ip 和port

    int getpeername(int s, struct sockaddr *name, socklen_t *namelen);描述获取socket的对方地址struct sockaddr_in ...

  7. Element-UI 的树列表实现单选

    1. Element-UI 的 el-tree 组件当设置了 show-checkbox 属性以后,默认是只能多选的,如果我们想要将其改选为单选,就要进行一些特殊的处理,首先看效果图. 2. 组件代码 ...

  8. python中os模块获取路径的几种方式

    一.代码 import os BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) p ...

  9. NX二次开发-UF_MODL_ask_distance_tolerance获取建模的长度公差

    NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_ui.h> UF_initialize() ...

  10. NX二次开发-如何判断孔特征和边倒圆是否在凸台特征后面?

    在建模的时候,部件导航器里的特征按建模顺序是有特征时间戳记的. 我们可以根据特征时间戳记的名字来判断哪个特征在前,哪个在后. #include <uf.h> #include <uf ...