本文主要是介绍DTOJ4356. 排列(perm),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意:
给一个长度为n的排列,可以进行任意次操作,每次操作都将一个逆序对翻转,求可以到达的不同的序列的个数。
n<=20
题解:
求方案数这个问题太难,先考虑一个简单一点的问题:已知一个排列,判断它是否能到达。考虑翻转的过程,对于每一次操作,都是将大的数向后移,将小的数向前移的过程,所以最大的数右移完后就不动了,同理,次大的数在最大的数后,它也只能右移,然后不动。于是从大到小考虑每一个数,发现这个序列要可达,当且仅当比它大的数的位置能一一对应到原序列中不在它后面比它大的数的位置,因为对于每一个比它大的数,在之前的交换中,若有被交换到前面,也只会交换到更大的数的位置,故不可能对应到更前面的位置。这样,计算方案数就显然,仍然从大到小枚举,n很小,所以记录下每个位置是否选过,枚举当前数的位置即可。
这篇关于DTOJ4356. 排列(perm)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!