n个人排名,允许并列名次,共有多少种排名结果?
2017-09-22 21:24
393 查看
n个人排名,允许并列名次,共有多少种排名结果?
经典问题了,可以考虑递推:假设n个人,排出了m个名次,有f(n,m)种结果(1<=m<=n)
当m=1
f(n,m)=1
当n<m
f(n,m)=0
当1<m<=n
假设n-1个人,排出了m个名次;新来1人,与前面某名次并列,有f(n-1,m)*m种结果
假设n-1个人,排出了m个名次;新来1人,与前面名次都不并列,有f(n-1,m-1)*m种结果
f(n,m)= f(n-1,m)*m + f(n-1,m-1)*m
综合上述,递推式:
0 n<m||m<1
f(n,m) = 1
4000
1=m<=n
(f(n-1,m) + f(n-1,m-1))*m 1<m<=n
n个人的排名就是f(n,1)+f(n,2)+f(n,3)+...+f(n,n)
作者:王希
链接:https://www.zhihu.com/question/30200444/answer/47183882
来源:知乎
一、直接动态规划
我们用
表示有
个人,
种名次。那么显然有如下关系成立:
第一条是没有并列的情况,直接全排列;
第二条是全部并列,显然只有1种;
第三条是状态转移方程:当
个人排完名次之后加入一个人,有两种情况:
他和某一个或几个人并列,这种情况下之前就已经有
个排名了,他可能和这
种中的任何一种并列;
他有一个新的名词,这种情况相当于他在
个空档中选择一个,有
种可能。
而答案就是
对
求和。写个程序算一下前几项:
#include <stdio.h> #define A 15 typedef long long LL; LL dp[A][A],ans[A],fact[A]; void fac() { for(int i = 1;i < A;i++) fact[i] = (i==1?1:(fact[i-1]*i)); } void solve() { for(int i = 1;i < A;i++) ans[i] = 0; for(int i = 1;i < A;i++) for(int j = i;j < A;j++) { if(i==j) dp[i][j] = fact[i]; else if(i==1) dp[i][j] = 1; else dp[i][j] = i*dp[i][j-1] + i*dp[i-1][j-1]; } for(int i = 1;i < A;i++) for(int j = 1;j <= i;j++) ans[i] += dp[j][i]; } int main() { fac(); solve(); for(int i = 1;i < A;i++) printf("f[%d] = %lld\n",i,ans[i]); return 0; }
相关文章推荐
- 组合数学之把n个不同的东西分给k个人,共有多少种分法
- n个不同的东西分给k个人,共有多少种分法
- mysql:名次排名 (并列与不并列)
- 把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法
- mysql:名次排名 (并列与不并列)
- 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?
- 允许并列的排名
- 某种传染病第一天只有一个患者,前五天为潜伏期,不发作也不会传染人 第6天开始发作,从发作到治愈需要5天时间,期间每天传染3个人 求第N天共有多少患者
- 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?
- 某种传染病第一天只有一个患者,前五天为潜伏期,不发作也不会传染人 第6天开始发作,从发作到治愈需要5天时间,期间每天传染3个人 求第N天共有多少患者
- 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
- 在此上下文中不允许使用子查询。只允许使用标量表达式。Insert 查询结果-解决方法
- a=5,b=8,c=9; x=a&amp;lt;b||c++ 最后结果,c是多少呢?
- n! 的结果中包含多少个0(Go语言实现)
- 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个
- 打卡挂机功能 显示推广帐号 等个人信息 定制需多少钱?
- 个人管理:使用“为什么”来改变我们的结果
- 智能手机的密码锁共有多少种
- 敏捷个人2011.8月份线下活动报道:敏捷个人和敏捷结果,设计你的一天,设计你的一周
- 一只青蛙从第一级台阶跳到第n级,每次可以跳任意级,共有多少种跳法,并写出递推式