题意:有来自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的更多相关文章

  1. HDU 4532 湫秋系列故事——安排座位 (组合+DP)

    湫秋系列故事——安排座位 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)To ...

  2. [HDU4532]湫秋系列故事——安排座位

    题面在这里 description 有\(n\)种颜色的小球,每种颜色的小球有\(a_i\)个: 要把它们摆成一排,求相邻小球颜色不相同的摆放方案数. 任意两个合理的安排方法,只要有一个位置的同学不同 ...

  3. hdu ---(4517)小小明系列故事——游戏的烦恼(Dp)

    小小明系列故事——游戏的烦恼 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)To ...

  4. hdu 4502吉哥系列故事——临时工计划 (简单DP)

    Problem Description 俗话说一分钱难倒英雄汉,高中几年下来,吉哥已经深深明白了这个道理,因此,新年开始存储一年的个人资金已经成了习惯,不过自从大学之后他不好意思再向大人要压岁钱了,只 ...

  5. HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包)

    HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包) 题意分析 裸完全背包 代码总览 #include <iostream> #include <cstdio& ...

  6. HDU 4539郑厂长系列故事――排兵布阵(状压DP)

    HDU 4539  郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 //#pragma co ...

  7. HDU 4539 郑厂长系列故事——排兵布阵

    http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事——排兵布阵 Time Limit: 10000/5000 MS (Java/Others) ...

  8. HDU 4539 郑厂长系列故事——排兵布阵 状压dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/O ...

  9. HDU 4539 郑厂长系列故事——排兵布阵 —— 状压DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事——排兵布阵 Time Limit: 10000/5000 MS (Java/Ot ...

随机推荐

  1. 奥迪--Q5

    -型号:Q5 -价格:40-53W -动力:2T -变速箱:8挡手自一体 -长宽高:4.63,1.90,1.66 -油箱:75L -发动机:EA888 -大灯:氙气

  2. P1514 引水入城

    概述 首先,这是一道好题,这道题既考查了图论的dfs知识,又考察了区间贪心问题中很典型的区间覆盖问题,着实是一道好题. 大概思路说明 我们观察到,只有第一行可以放水库,而第一行在哪里放水库的结果就是直 ...

  3. Java网络通信初步认知

    本文转载自:http://wing011203.cnblogs.com/ 在这篇文章里,我们主要讨论如何使用Java实现网络通信,包括TCP通信.UDP通信.多播以及NIO. TCP连接 TCP的基础 ...

  4. 关于ios8模拟器不能输入中文问题以及软键盘不弹出问题

    在Xcode菜单栏中   Product->scheme->Edit Scheme->Options->Application Region改为中国,就可以输入中文了, 如果软 ...

  5. linux下python安装到指定目录

    由于使用公司服务器时没有root权限,只能把python安装到个人文件夹下,使用源码包方式安装,这里记录一下. 1.python下载 cd到目录/users/w,在此目录下安装python.通过wge ...

  6. HTML5革命即将爆发

    近日,关于"HTML5生态重建冷思考"成为了很多人热烈讨论的话题.在网页制作市场上面,HTML5技术成为了颇为关注的焦点,在行业和社会各界引起了广泛的关注.HTML5网页制作也创造 ...

  7. Python之路-python(paramiko,进程和线程的区别,GIL全局解释器锁,线程)

    一.paramiko 二.进程.与线程区别 三.python GIL全局解释器锁 四.线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生 ...

  8. PL/SQL 存储函数和过程

    --存储过程 .不带参: create or replace procedure 存储过程名 as|is --说明部分 begin --执行的语句: end: 调用存储过程 execute 存储过程名 ...

  9. docker入门的文章

    PART 1: OVERVIEW OF MICROSERVICE ARCHITECTURE & CONTAINERIZATION PART II: GETTING SET-UP AND STA ...

  10. [Android Tips] 4. Dismiss PopupWindow when touch outside

    PopupWindow.setFocusable(true);