2015年百度之星资格赛第一题分析

这个是今年百度之星资格赛的第一题,我一开始使用了暴力的方法做,发现发TLE,后来改用DP过了。

一、题目大意

有N个人,每个人有个位置i(),每个人位置都不同。对这N个人重新排位置,一种排位置规则规定第i个人换到第j个位置,其中。两种排位置规则中只要有一个人对应到了不同的位置,就称这两个排位置规则不同。用同一种排位置规则对这N个人重新排了两次位置,发现所有人和排位置之前的位置都一样。问有多少种这样的排位置规则。

比如一种排位置规则为[1->2,2->1,3->3],就是说第一个人到第二个位置,第二个人到第一个位置,第三个人位置不动。假设有a、b和c三个人顺序为[a,b,c],排序一次后[b,a,c],排序两次后为[a,b,c],与排序前相同。

二、暴力做法

满足两次排序位置不变而且位置发生变化,就是要使得两个人i和j作为一对,排序规则中。N个人,如果只取一对一共可以有对,如果取两对一共可以有种,依次类推。我们在每次排序规则中可以添加任意对,所以最终结果为

(N为偶数)或者

(N为奇数)

三、DP解法

在上面方法超时之后,就想可能是动态规划问题。就慢慢开始想,受上面一对一对考虑,才有了下面的思路。设f(n)为当N=n时符合要求的排位置规则总数。我们考虑n个人时,把这n个人分成两部分,n-2个人和2个人。

1.如果这2个人,在产生对的过程不和前n-2个人混在一起分别组成一对。则有前面n-2人有f(n-2)种情况,而该2个人有两种情况(1->1,2->2或者1->2,2->1)。一共2*f(n-2)种情况。

2.如果这2个人,如果其中一个人和前面n-2个人混在一起组成一对,剩余一个人不变位置(i->i)。对于一个人和n-2一起一共n-1个人,有f(n-1)种情况。如果这个人单独考虑也就是不组成一对,一共f(n-2)中情况。故两种情况的差值就是这个人和前面n-2个人中某个组成一队的总情况数,即f(n-1)-f(n-2)种。一共(f(n-1)-f(n-2))*2种情况。

3.如果这2个人,都和前面n-2个人混在一起,则从前n-2个人中挑出2个人和这两个人分别组成一对,一共(n-3)*(n-4)种挑法。剩余n-4个人有f(n-4)种情况。所以一共(n-3)*(n-4)*f(n-4)种情况。

所以把上面情况加起来,可以得到状态转移方程:

f(n)=f(n-1)*2+(n-3)*(n-4)*f(n-4)。

我第一次AC的方法就是通过这种方法。但总感觉这种方法比较麻烦。

后来发现了很简单明了的方法。应该就是标准做法。状态转移方程应该是f(n)=f(n-1)+(n-1)f(n-2)。这种方法是将n个人分成两部分,n-1个人和1个人。

1.如果这1个人不和前面n-1个人的某一个组成一对,也就是说排序中不变动位置,前面n-1个人有f(n-1)种方法。故一共有(n-1)种方法。

2.如果这1个人和前面n-1个人中的某一个组成一对,则挑出一个元素有(n-1)种情况,剩余n-2个人有f(n-2)种方法。故一共有(n-1)*f(n-2)种方法。

总结出了状态转移方程,注意下long long可能越界的问题,打表输出即可搞定。

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值