题目大意
NowCoder每天要给很多人发邮件。有一天他发现发错了邮件,把发给A的邮件发给了B,把发给B的邮件发给了A。于是他就思考,要给n个人发邮件,在每个人仅收到1封邮件的情况下,有多少种情况是所有人都收到了错误的邮件?
即没有人收到属于自己的邮件。
解题思路
定义一个数组dp
表示存储错误方式数量,dp[i]
表示i
个邮件和人的错误发送数量。
- 把第
n
个元素放在一个位置,比如位置k
,一共有n-1
种方法。 - 放编号为
k
的元素,这时有两种情况:
(1)把它放到位置n
,那么剩下的n-1
个元素,由于第k
个元素放到了位置n
,剩下n-2
个元素就有dp[n-2]
种放法。
(2)把第k
个元素不放到位置n
的情况,那么对于n-1
个元素,有dp[n-1]
种放法。注意:这个地方饶了好久,一直感觉会和情况一有重合的情况,就是k
也有可能放到n
的位置。但是,此时k
的位置已经被占用了,我们可以把n
看做是k
所对应的专属收件人,这样来说他不能发给