HDU-4532 湫秋系列故事——安排座位 组合数学DP
题意:有来自n个专业的学生,每个专业分别有ai个同学,现在要将这些学生排成一行,使得相邻的两个学生来自不同的专业,问有多少种不同的安排方案。
分析:首先将所有专业的学生视作一样的,最后再乘以各自学生的数量的阶乘。排列的时候通过动态规划来处理,设状态为前i个系,一共有j个位置相邻位置来自同系,然后转移。具体见代码注释。
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; typedef long long LL;
const LL mod = (int)(1e9)+;
LL A[];
LL C[][];
LL dp[][]; // dp[i][j]表示处理到第i组,一共还有j个位置左右坐的同学来自同一个专业
int n;
int seq[]; void pre() {
A[] = A[] = ;
for (int i = ; i < ; ++i) {
A[i] = A[i-] * i % mod;
}
for (int i = ; i < ; ++i) {
C[][i] = ;
for (int j = ; j <= i; ++j) {
C[j][i] = (C[j][i-] + C[j-][i-]) % mod;
}
}
} int solve() {
memset(dp, , sizeof (dp));
dp[][seq[]-] = ; // 给相邻同学来自一个系的间隙叫做粘着点
LL sum = seq[];
for (int i = ; i <= n; ++i) {
for (int j = ; j < sum; ++j) { // sum表示处理到前i-1组最多有sum个粘着点
for (int k = ; k <= seq[i]; ++k) { // 枚举第i组同学被拆分成k个块放入到队伍中
for (int h = ; h <= j && h <= k; ++h) {
// 枚举有h个块放到了前面的j个粘着点,即破坏了粘着点,但显然块内带来了新的粘着点
dp[i][j-h+seq[i]-k] += dp[i-][j]*C[h][j]%mod*C[k-h][sum+-j]%mod*C[k-][seq[i]-]%mod;
// C[h][j]表示h个快插入了哪些粘着点
// C[k-h][sum-1-j]表示k-h个块插入了那些非粘着点,总间隙是sum+1个
// C[k][seq[i]-1]表示这seq[i]个同学是如何划分成k个块的
dp[i][j-h+seq[i]-k] %= mod;
}
}
}
sum += seq[i];
}
LL ret = dp[n][];
for (int i = ; i <= n; ++i) {
ret = ret * A[seq[i]] % mod;
}
return ret;
} int main() {
int T, ca = ;
pre();
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
for (int i = ; i <= n; ++i) {
scanf("%d", &seq[i]);
}
printf("Case %d: %d\n", ++ca, solve());
}
return ;
}
HDU-4532 湫秋系列故事——安排座位 组合数学DP的更多相关文章
- HDU 4532 湫秋系列故事——安排座位 (组合+DP)
湫秋系列故事——安排座位 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)To ...
- [HDU4532]湫秋系列故事——安排座位
题面在这里 description 有\(n\)种颜色的小球,每种颜色的小球有\(a_i\)个: 要把它们摆成一排,求相邻小球颜色不相同的摆放方案数. 任意两个合理的安排方法,只要有一个位置的同学不同 ...
- hdu ---(4517)小小明系列故事——游戏的烦恼(Dp)
小小明系列故事——游戏的烦恼 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)To ...
- hdu 4502吉哥系列故事——临时工计划 (简单DP)
Problem Description 俗话说一分钱难倒英雄汉,高中几年下来,吉哥已经深深明白了这个道理,因此,新年开始存储一年的个人资金已经成了习惯,不过自从大学之后他不好意思再向大人要压岁钱了,只 ...
- HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包)
HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包) 题意分析 裸完全背包 代码总览 #include <iostream> #include <cstdio& ...
- HDU 4539郑厂长系列故事――排兵布阵(状压DP)
HDU 4539 郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 //#pragma co ...
- HDU 4539 郑厂长系列故事——排兵布阵
http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事——排兵布阵 Time Limit: 10000/5000 MS (Java/Others) ...
- HDU 4539 郑厂长系列故事——排兵布阵 状压dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/O ...
- HDU 4539 郑厂长系列故事——排兵布阵 —— 状压DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事——排兵布阵 Time Limit: 10000/5000 MS (Java/Ot ...
随机推荐
- javaWeb中servlet开发(3)——Servlet生命周期
生命周期:是一个程序的存在周期,servlet由于是受容器的管理,所以容器来决定其生命周期 1.servlet生命周期 2.servlet生命周期对应的方法 3.servlet生命周期代码 publi ...
- [troubleshoot][archlinux][bcache] 修改linux文件系统 / 分区方案 / 做混合硬盘 / 系统转生大!手!术!(调整底层架构,不!重!装!)
目标: 我要做的事情是:修改文件系统,硬盘分区方案,但是不重装系统,整个操作不被应用层感知. 背景: 我的笔记本 ThinkPad T450.8G内存 + 16GB SSD + 1TB HDD.预装w ...
- oracle从零开始学习笔记
查询现有数据库:select name from V$database; 解锁用户scott:alter user scott account unlock; 普通用户连接:conn scott 默认 ...
- Jmeter工作原理
- url传值错误
ValueError at /add/ invalid literal for int() with base 10: ''6'' Request Method: GET Request URL: h ...
- [原创]java WEB学习笔记97:Spring学习---Spring 中的 Bean 配置:IOC 和 DI
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- matlab中imresize
matlab中函数imresize简介: 函数功能:该函数用于对图像做缩放处理. 调用格式: B = imresize(A, m) 返回的图像B的长宽是图像A的长宽的m倍,即缩放图像. m大于1, 则 ...
- [转] 关于ubuntu的sources.list总结
点击阅读原文 一.作用 文件/etc/apt/sources.list是一个普通可编辑的文本文件,保存了ubuntu软件更新的源服务器的地址.和sources.list功能一样的是/etc/apt/s ...
- 转 java中的session
书中讲:以下情况,Session结束生命周期,Servlet容器将Session所占资源释放:1.客户端关闭浏览器2.Session过期3.服务器端调用了HttpSession的invalidate( ...
- Python—进程、线程、协程
一.线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 方法: ...