HDU - 4532 湫秋系列故事――安排座位

原创 2013年12月02日 21:15:35

Description

  为了给腾讯公司找到更多优秀的人才,HR湫秋最近去某高校组织了一次针对该校所有系的聚会,邀请了每个系的一些优秀学生来参加。

  作为组织者,湫秋要安排他们的座位。这并不是一件很简单的事情,因为只有一排位置,并且位置总数恰好等于参加聚会的人数。为了促进交流,两个来自相同系的同学不可以座位相邻。湫秋现在希望知道有多少种不同的合理安排座位的方法(任意两个合理的安排方法,只要有一个位置的同学不同,都被认为是不同的)。
 

Input

输入第一行为T,表示有T组测试数据。
每组数据一个N开始,表示一共有多少个系。下面的一行包含N个整数Ai,表示每个系的到场人数。

[Technical Specification]
1. 1 <= T <= 47
2. 1 <= N, Ai <= 47
3. 1 <= Sum(Ai) <= 447
 

Output

对每组数据,先输出为第几组数据,然后输出结果。由于结果可能很大,输出对1,000,000,007 取余后的结果。
 

Sample Input

3 2 1 2 2 1 3 3 1 2 3
 

Sample Output

Case 1: 2 Case 2: 0 Case 3: 120

参考: 点击打开链接

#include <cstdio>  
#include <iostream>
#include <cstring>  
#include <algorithm>  
#define ll long long   
using namespace std;  
#define m 1000000007  


ll dp[50][480];   
ll C[500][500];  
ll A[500];      
int a[50];  

int main(){  
    int t,n;  
    C[0][0] = 1;  
    for (int i = 1; i <  480; i++){  
        C[i][0] = 1;  
        for (int j = 1; j < i; j++)  
            C[i][j] = (C[i-1][j-1] + C[i-1][j])%m;  
        C[i][i] = 1;  
    }  
    A[0] = A[1] = 1;  
    for (int i = 2;i < 480; i++)  
        A[i] = (A[i-1] * i)%m;  

    scanf("%d",&t);  
    for (int ca = 1; ca <= t; ca++)  {  
        scanf("%d",&n);  
        for (int i = 1; i <= n; i++)  
            scanf("%d",&a[i]);  
        memset(dp,0,sizeof(dp));  
        dp[1][a[1]-1] = 1;
        ll sum = a[1];  
        for (int i = 2; i <= n; i++)  {  
            for (int j = 0; j < sum; j++){  
                for (int k = 1; k <= a[i]; k++){  
                    for(int u = 0; u <= j && u <= k; u++){  
                        dp[i][j-u+a[i]-1-(k-1)]=(dp[i][j-u+a[i]-k]  
                        +(((dp[i-1][j]*C[j][u])%m*C[sum+1-j][k-u])%m
                            *C[a[i]-1][k-1])%m)%m;  
                    }  
                }  
            }  
            sum += a[i];  
        }  
        printf("Case %d: ",ca);  
        ll ans = dp[n][0];  
        for (int i = 1; i <= n; i++)
            ans = (ans * A[a[i]])%m;  
        printf("%lld\n",ans);  
    }  
    return 0;  
}



[组合数 DP] HDU 4532 湫秋系列故事——安排座位

一种典型的组合数DP  f[i][j]表示前i种数值排列有j个不合法间隙的方案数 然后枚举第i个分成几块k 有l块塞入j个不合法空隙中进行转移 答案即为f[n][0] 不过还要乘以排列数 ...
  • u014609452
  • u014609452
  • 2016年09月27日 18:04
  • 469

hdu 4544 湫湫系列故事——消灭兔子

湫湫系列故事——消灭兔子 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) To...
  • u011721440
  • u011721440
  • 2014年03月07日 18:09
  • 781

HDU Problem 4514 湫湫系列故事——设计风景线 【并查集+树的直径】

湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) ...
  • lututu123
  • lututu123
  • 2016年08月02日 17:21
  • 173

HDU4532(组合DP)

题目:安排座位   解析:http://www.douban.com/note/269136472/   #include #include #include using na...
  • ACdreamers
  • ACdreamers
  • 2013年08月25日 15:49
  • 1636

hdu4532 组合数学+dp

湫秋系列故事——安排座位 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) T...
  • u012866104
  • u012866104
  • 2015年04月27日 01:23
  • 493

HDU - 4532 湫秋系列故事――安排座位

Description   为了给腾讯公司找到更多优秀的人才,HR湫秋最近去某高校组织了一次针对该校所有系的聚会,邀请了每个系的一些优秀学生来参加。   作为组织者,湫秋要安排他们的座...
  • u011345136
  • u011345136
  • 2013年12月02日 21:15
  • 834

vijos1286座位安排(状压dp加组合数加gcd)

背景 快要期中考试了!老师需要hzy帮他排考试的座位。。。 描述 考场里的座位恰好有n行m列,并且恰好有n*m位考生在这个考场里面考试,也就是说,所有的座位上都有考生。hzy根据学校...
  • hpp__hpp
  • hpp__hpp
  • 2017年07月21日 22:29
  • 125

HDU - 4532 湫秋系列故事――安排座位 (组合数dp)

湫秋系列故事——安排座位 Problem Description   为了给腾讯公司找到更多优秀的人才,HR湫秋最近去某高校组织了一次针对该校所有系的聚会,邀请了每个系的一些优秀学...
  • HHH_go_
  • HHH_go_
  • 2017年08月08日 19:20
  • 141

HDU - 4508-湫湫系列故事——减肥记I(完全背包模板题)

对于吃货来说,过年最幸福的事就是吃了,没有之一!   但是对于女生来说,卡路里(热量)是天敌啊!   资深美女湫湫深谙“胖来如山倒,胖去如抽丝”的道理,所以她希望你能帮忙制定一个食谱,能使她吃...
  • qq_38712932
  • qq_38712932
  • 2018年01月30日 10:39
  • 15

为什么中国的程序员技术偏低

http://sd.csdn.net/a/20110919/304602.html 导读:中国的软件公司的性质直接导致程序员的水平的高低。本文所说的软件公司,不是指某个或者某几个...
  • yljordan
  • yljordan
  • 2011年12月06日 15:28
  • 117
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU - 4532 湫秋系列故事――安排座位
举报原因:
原因补充:

(最多只允许输入30个字)