Codeforces 37D Lesson Timetable - 组合数学 - 动态规划
2018-03-07 17:12
369 查看
题目传送门
神奇的门I
神奇的门II
题目大意
有$n$组学生要上课2次课,有$m$个教室,编号为$1$到$m$。要确定有多少种不同的安排上课的教室的方案(每组学生都是本质不同的),使得它们满足:
每组学生第一次上课的教室的编号小于等于第二次上课的教室的编号。
第$i$间教室在第一次上课时,恰好有$x_{i}$组学生在场。
第$i$间教室在某次上课时,中间包含的学生组数不能超过$y_{i}$。
输出答案模$10^{9} + 7$。
因为第一次上课恰好有多少人,所以这个方案数是可以直接用组合数,暂时可以扔掉。
对于第二次上课的时候,考虑用动态规划来做,用$f[i][j]$表示,考虑到第$i$个教室,当前一共还有$j$个人没有分配教室。
转移的时候枚举在第$i$个教室中上课的人数,再乘一乘组合数就好了。
神奇的门I
神奇的门II
题目大意
有$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 = 1005, M = 105, mod = 1e9 + 7; int n = 0, m; int xs[M], ys[M]; int C ; int f[M] ; inline void init() { scanf("%d", &m); for (int i = 1; i <= m; i++) scanf("%d", xs + i), n += xs[i]; for (int i = 1; i <= m; i++) scanf("%d", ys + i); } inline void solve() { C[0][0] = 1; for (int i = 1; i <= n; i++) { C[i][0] = C[i][i] = 1; for (int j = 1; j < i; j++) C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % mod; } int s = 0, ans; f[0][0] = 1; for (int i = 1; i <= m; i++) { s += xs[i]; for (int j = xs[i]; j <= s; j++) for (int k = 0; k <= j && k <= ys[i]; k++) f[i][j - k] = (f[i][j - k] + f[i - 1][j - xs[i]] * 1ll * C[j][k]) % mod; } ans = f[m][0]; for (int i = 1; i <= m; i++) { ans = (ans * 1ll * C [xs[i]]) % mod; n -= xs[i]; } printf("%d\n", ans); } int main() { init(); solve(); return 0; }
相关文章推荐
- Codeforces 28C Bath Queue - 动态规划 - 组合数学 - 概率与期望
- Codeforces 51E Pentagon - 组合数学 - 动态规划
- 【HDU 3208】 组合数学+动态规划 湫秋系列故事——安排座位
- codeforces 900D(组合数学+剪枝)
- CodeForces 128C Games with Rectangle 组合数学
- 51nod 1202 子序列个数 (组合数学 +动态规划)
- CodeForces 617 B. Chocolate(组合数学)
- CodeForces 340 C.Tourist Problem(组合数学)
- 【CodeForces】889 C. Maximum Element 排列组合+动态规划
- codeforces 559C Gerald and Giant Chess(组合数学)
- CodeForces 785D Anton and School - 2 组合数学
- codeforces 630H (组合数学)
- BZOJ2302: [HAOI2011]Problem c|动态规划|组合数学
- Codeforces 615D Multipliers 【组合数学】
- Codeforces 554C Kyoya and Colored Balls 【dp + 组合数学】
- CodeForces - 554C Kyoya and Colored Balls (组合数学&逆元模板)
- codeforces 900D(组合数学+剪枝)
- CodeForces 123 C.Brackets(组合数学+dp)
- CodeForces 272 D.Dima and Two Sequences(组合数学)
- codeforces 869C The Intriguing Obsession 组合数学,逆元