错排问题--十二金钗

原创 2015年07月08日 20:27:07

#每日一面BAT#第6题:金钗赛诗

每日一面BAT
赛诗会后,十二金钗待奔前程。
分别宴上,12人各写了一首诗放入宝囊。
大家随机取一个,若取到自己的诗,则再取一个并放回自己的诗。
12人都拿到诗算一种分配。

问:共有多少种不同的分配?


问题来源:http://ask.julyedu.com/question/608?notification_id=31929&rf=false&item_id=2160,2164#!answer_2164

关于错排问题,百度百科有很清楚的解释(wiki也有。。。不过打不开/(ㄒoㄒ)/~~)

附上百度百科的链接:http://baike.baidu.com/view/668994.htm

既然百度百科都解释的很清楚了,我就不再多说废话了。说说我的做法。

以下黑体部分来自百度百科:

当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用D(n)表示,那么D(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推.
第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法;
第二步,放编号为k的元素,这时有两种情况:⑴把它放到位置n,那么,对于剩下的n-1个元素,由于第k个元素放到了位置n,剩下n-2个元素就有D(n-2)种方法;⑵第k个元素不把它放到位置n,这时,对于这n-1个元素,有D(n-1)种方法;
综上得到
D(n) = (n-1) [D(n-2) + D(n-1)]
特殊地,D(1) = 0, D(2) = 1.

D(1)=0 只有一个元素的时候,怎么放都是原来的位置,所以没有错排的可能

D(2)=1 两个元素的时候,相互调换一下位置就可以得到一种错排,也仅有这一种错排。

好了,现在我们有了递推公式,同时也有了初始值,因此我们就可以写一个函数(此处用C++语言)来计算出n个元素的错排分配种类数。

代码如下:

int wrongSort(int n)
{
    int f1 = 0; //D(1) = 0
    int f2 = 1;  //D(2) = 1
    int Dn = 0;
    if (n == 1)
    {
        Dn = f1;
    }else if(n == 2)
    {
        Dn = f2;
    }
    for (int i = 3; i <= n; i++)
    {
        Dn = (i-1)*(f1+f2); //D(n) = (n-1) [D(n-2) + D(n-1)]
        f1 = f2;
        f2 = Dn;
    }
    return Dn;
}

递推公式可以推导出结果的数学表达式,不过我看那个表达式挺长的,而且真的需要计算结果的时候,也不是那么容易就能得到结果。

所以我就直接采用递推来计算。算法复杂度O(n)。时间复杂度T(n)

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

AS开发中出现Error(十二)——Library中引用aar报错的问题

1、场景:最近项目需求,做了一个人脸识别的功能,而人脸识别又是第三方提供的,对方给的是一个demo,而且资源文件很多,布局也有,这些是对方提供给我们进行可修改的。然后觉得这样引入到项目中那必须会很乱,...

(十二)jemter-常见报错/乱码问题---学习笔记

1.使用badboy录制脚本时提示弹出脚本错误,网上搜的答案没有解决-------未解决。 解决方法:浏览器工具-》Internet选项-》高级属性页-》选中“禁止脚本调试”复选框。之后就不会...
  • zjq001X
  • zjq001X
  • 2016年11月10日 14:34
  • 867

Mac OS使用技巧之十二:解决APP Store更新、下载出错的问题

解决苹果电脑APP Store更新、下载出错的方法

十二、图的算法入门--(4)最短路问题---Dijkstra算法实现

摘自计蒜客:http://www.jisuanke.com/course/35/7557 先来看这样一个问题:有n座城市,已知任意两个座城市之间的距离,现在要分别求出城市A到其他n-1座城市的最短路径...

关于【今日学堂】十二问——回答[今日学堂]的性质、定位,以及教学特色等问题

问题一:今日学堂是一个什么性质的学校? 回 答:在中国的教育体系中,尚无法对今日学堂的性质加以界定的,它当然不是公立学校,但也不是严格意义的民办学校和私立学校,一些媒体把今日学堂称为私塾, 其实...

问题十二:怎么用ray tracing画第一张图

ray 类:(位于ray.h中。ray.cpp为空) #ifndef RAY_H #define RAY_H #include "vec3.h" class ray { public: ...

简单编程题目连载(十二)——最优编辑问题

最优编辑问题

J2EE进阶(十二)SSH框架整合常见问题汇总(三)

J2EE进阶(十二)SSH框架整合常见问题汇总(三)问题16      在挂失用户时,发现userid值为空,但是在前台输入处理账号22时,通过后台输出可以看出,后台根据前端输入在数据库中查询到结果对...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:错排问题--十二金钗
举报原因:
原因补充:

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