组合dp hud-4532-湫秋系列故事——安排座位
2013-06-18 21:23
162 查看
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4532
题目意思:
告诉n个系的每个系的人数,求出排列数,使得任意相邻两个人来自不同的系,求出总的排列数。
解题思路:
记dp[i][j]:表示前i个系,中间有j个空位使得相邻两个人来自同一个系的组合数。
先求出组合数,然后求出排列数。
本题的关键:将难以避免考虑的情况(相邻的来自同一个系),设为一种状态来分析。
再说明一下:
四重循环的意思:
第一重循环枚举系的种数 i:第i种
第二重循环枚举前面有多少个空位置j,使得该位置前后两人为同一个系
第三重循环枚举要把a[i]个人分成多少个部分,k,说明分成k个部分,一共会减少k-1个空,增加a[i]-1-(k-1)个空
第四重循环枚举k个部分中有多少个部分在前面的j个空中,u,则剩下的k-u个部分,一共有sum+1-j个位置可用
代码:
http://acm.hdu.edu.cn/showproblem.php?pid=4532
题目意思:
告诉n个系的每个系的人数,求出排列数,使得任意相邻两个人来自不同的系,求出总的排列数。
解题思路:
记dp[i][j]:表示前i个系,中间有j个空位使得相邻两个人来自同一个系的组合数。
先求出组合数,然后求出排列数。
本题的关键:将难以避免考虑的情况(相邻的来自同一个系),设为一种状态来分析。
再说明一下:
四重循环的意思:
第一重循环枚举系的种数 i:第i种
第二重循环枚举前面有多少个空位置j,使得该位置前后两人为同一个系
第三重循环枚举要把a[i]个人分成多少个部分,k,说明分成k个部分,一共会减少k-1个空,增加a[i]-1-(k-1)个空
第四重循环枚举k个部分中有多少个部分在前面的j个空中,u,则剩下的k-u个部分,一共有sum+1-j个位置可用
代码:
<span style="font-size:18px;">#include<iostream> #include<cmath> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<algorithm> #include<vector> #include<map> #include<stack> #include<list> #include<queue> #define eps 1e-6 #define INF (1<<30) #define PI acos(-1.0) #define ll __int64 using namespace std; #define m 1000000007 ll dp[50][480]; //表示前i个系中,有j个空位使得该空位旁边为同一个系的位置数 ll C[500][500]; //先求出组合数,然后再求出排列数 ll A[500]; //A[i]表示i个元素的全排列 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++) //将a[i]个元素分成k组 { for(int u=0;u<=j&&u<=k;u++) //将u组放到前j个空位中 { 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 [0]; for(int i=1;i<=n;i++) //对每一组,进行全排列 ans=(ans*A[a[i]])%m; printf("%I64d\n",ans); } return 0; } </span>
相关文章推荐
- [组合数 DP] HDU 4532 湫秋系列故事——安排座位
- HDU 4532 湫秋系列故事——安排座位(组合DP)
- HDU-4532 湫秋系列故事——安排座位 组合数学DP
- hdu 湫秋系列故事——安排座位(组合dp)
- HDU 4532 湫秋系列故事——安排座位(组合)
- HDU - 4532 湫秋系列故事――安排座位 (组合数dp)
- HDU - 4532 湫秋系列故事――安排座位
- HDU 湫秋系列故事——安排座位 组和DP
- HDU 4532 湫秋系列故事——安排座位 (组合+DP)
- 【HDU 3208】 组合数学+动态规划 湫秋系列故事——安排座位
- hdu 4532 湫秋系列故事——安排座位
- [2013腾讯马拉松复赛第一场]HDU 4532 湫秋系列故事——安排座位
- 湫秋系列故事——安排座位
- 湫秋系列故事——安排座位
- hdu 4504 威威猫系列故事——篮球梦(组合中dp的应用)
- vijos - P1286座位安排 (DP状态压缩 + 组合数 + python)
- HDU 4540 威威猫系列故事——打地鼠 (状态压缩DP)
- HDU4502:吉哥系列故事——临时工计划(DP)
- HDU 4504 威威猫系列故事——篮球梦(dp)
- hdu - 4511 小明系列故事——女友的考验(AC自动机+DP)