Codeforces 37D Lesson Timetable - 组合数学 - 动态规划
题目传送门
题目大意
有$n$组学生要上课2次课,有$m$个教室,编号为$1$到$m$。要确定有多少种不同的安排上课的教室的方案(每组学生都是本质不同的),使得它们满足:
- 每组学生第一次上课的教室的编号小于等于第二次上课的教室的编号。
 - 第$i$间教室在第一次上课时,恰好有$x_{i}$组学生在场。
 - 第$i$间教室在某次上课时,中间包含的学生组数不能超过$y_{i}$。
 
输出答案模$10^{9} + 7$。
因为第一次上课恰好有多少人,所以这个方案数是可以直接用组合数,暂时可以扔掉。
对于第二次上课的时候,考虑用动态规划来做,用$f[i][j]$表示,考虑到第$i$个教室,当前一共还有$j$个人没有分配教室。
转移的时候枚举在第$i$个教室中上课的人数,再乘一乘组合数就好了。
Code
/**
* Codeforces
* Problem#37D
* Accepted
* Time: 46ms
* Memory: 6388k
*/
#include <bits/stdc++.h>
using namespace std; const int N = , M = , mod = 1e9 + ; int n = , m;
int xs[M], ys[M];
int C[N][N];
int f[M][N]; inline void init() {
scanf("%d", &m);
for (int i = ; i <= m; i++)
scanf("%d", xs + i), n += xs[i];
for (int i = ; i <= m; i++)
scanf("%d", ys + i);
} inline void solve() {
C[][] = ;
for (int i = ; i <= n; i++) {
C[i][] = C[i][i] = ;
for (int j = ; j < i; j++)
C[i][j] = (C[i - ][j - ] + C[i - ][j]) % mod;
} int s = , ans;
f[][] = ;
for (int i = ; i <= m; i++) {
s += xs[i];
for (int j = xs[i]; j <= s; j++)
for (int k = ; k <= j && k <= ys[i]; k++)
f[i][j - k] = (f[i][j - k] + f[i - ][j - xs[i]] * 1ll * C[j][k]) % mod;
}
ans = f[m][];
for (int i = ; i <= m; i++) {
ans = (ans * 1ll * C[n][xs[i]]) % mod;
n -= xs[i];
}
printf("%d\n", ans);
} int main() {
init();
solve();
return ;
}
Codeforces 37D Lesson Timetable - 组合数学 - 动态规划的更多相关文章
- Codeforces 995F Cowmpany Cowmpensation - 组合数学
		
题目传送门 传送点I 传送点II 传送点III 题目大意 给定一个棵$n$个点的有根树和整数$D$,给这$n$个点标号,要求每个节点的标号是正整数,且不超过父节点的标号,根节点的标号不得超过D. 很容 ...
 - Codeforces 1029B. Creating the Contest 动态规划O(nlogn)解法 及 单调队列O(n)解法
		
题目链接:http://codeforces.com/problemset/problem/1029/B 题目大意:从数组a中选出一些数组成数组b,要求 b[i+1]<=b[i]*2 . 一开始 ...
 - 【组合数学+动态规划】在如下8*6的矩阵中,请计算从A移动到B一共有____种走法。要求每次只能向上或向右移动一格,并且不能经过P。
		
在如下8*6的矩阵中,请计算从A移动到B一共有__种走法.要求每次只能向上或向右移动一格,并且不能经过P. A:456 B:492 C:568 D:626 E:680 F:702 解析: 8*6的矩阵 ...
 - CodeForces 553E Kyoya and Train 动态规划 多项式 FFT 分治
		
原文链接http://www.cnblogs.com/zhouzhendong/p/8847145.html 题目传送门 - CodeForces 553E 题意 一个有$n$个节点$m$条边的有向图 ...
 - CodeForces 516A Drazil and Factorial 动态规划
		
原文链接http://www.cnblogs.com/zhouzhendong/p/8990592.html 题目传送门 - CodeForces 516A 题意 对于一个正整数$x$,$f(x)=x ...
 - Codeforces 40E Number Table - 组合数学
		
题目传送门 传送门I 传送门II 题目大意 给定一个$n\times m$的网格,每个格子上要么填$1$,要么填$-1$,有$k$个位置上的数是已经填好的,其他位置都是空的.问有多少种填法使得任意一行 ...
 - Codeforces 711D Directed Roads - 组合数学
		
ZS the Coder and Chris the Baboon has explored Udayland for quite some time. They realize that it co ...
 - Codeforces 866C Gotta Go Fast - 动态规划 - 概率与期望 - 二分答案
		
You're trying to set the record on your favorite video game. The game consists of N levels, which mu ...
 - Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem D (Codeforces 831D) - 贪心 - 二分答案 - 动态规划
		
There are n people and k keys on a straight line. Every person wants to get to the office which is l ...
 
随机推荐
- vue中打印显示++的问题解决方案(做成类似同步的操作就行了)
			
这个问题,困扰我很久很久 怎么实现的呢?首先进入页面就开始调取打印接口,打印接口的成功回调函数里面写 this.hasOut++(这是实时显示的数量)this.width=(this.hasOut/t ...
 - 编写一个程序解决选择问题。令k=N/2。
			
import java.util.Arrays; /** * 选择问题,确定N个数中第K个最大值 * @author wulei * 将前k个数读进一个数组,冒泡排序(递减),再将剩下的元素逐个读入, ...
 - chrome 搜索 jsonView
			
1.打开 https://github.com : 2.搜索 jsonView 链接:https://github.com/search?utf8=%E2%9C%93&q=jsonview: ...
 - wordpress练习
			
---恢复内容开始--- wp_options数据表储存网站的一些基本信息 bloginfo() //输出 bloginfo('stylesheet_url') //输出style.cs ...
 - 9.if/else/elif
			
简单的条件是通过使用 if/else/elif 语法创建的.条件的括号是允许的,但不是必需的.考虑到基于表的缩进的性质,可以使用 elif 而不是 else/if 来维持缩进的级别. if [expr ...
 - 31网络通信之Select模型
			
多路复用并发模型 -- select #include<sys/select.h> #include<sys/time.h> int select(int maxfd, f ...
 - lua学习之循环求一个数的阶乘
			
--第3题 利用循环求n的阶乘 --参数检查是否是自然数 function IsNaturalNumber(n) ~= )then return false else return true end ...
 - wxpython(python3.5)安装
			
安装步骤: http://blog.csdn.net/xiaodong193/article/details/51920283 注意:安装软件前需要阅读其中的README.txt,可快速知道安装方法, ...
 - yii2 rules验证规则,ajax验证手机号码是否唯一
			
<?php namespace frontend\models; use Yii; use yii\base\Model; /** * Signup form */ class SignupFo ...
 - uvalive 3887 Slim Span
			
题意: 一棵生成树的苗条度被定义为最长边与最小边的差. 给出一个图,求其中生成树的最小苗条度. 思路: 最开始想用二分,始终想不到二分终止的条件,所以尝试暴力枚举最小边的长度,然后就AC了. 粗略估计 ...