一、定义 X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! ai为整数,并且0<=ai<i(1<=i<=n) 简单点说就是,判断这个数在其各个数字全排列中从小到大排第几位。 比如 132,在1、2、3的全排列中排第2位。 二、作用 维基:n位 ...
分类:
其他好文 时间:
2018-06-06 21:38:26
阅读次数:
159
在一些问题中需要对全排列状态进行编码,如果使用完美hash来实现的话需要编码数量在计算机承受范围内,康托展开式符合条件 公式:X=An*(n-1)!+An-1*(n-2)!+......A2*1!+A1*0! 其中An等于在剩余元素中当前元素第几大(从0开始)。比如:1 4 2 6 5 3 7 8 ...
分类:
其他好文 时间:
2018-03-10 15:56:45
阅读次数:
211
康托展开: 1.定义:给一个n个不同数字的排列,求所有排列中比该排列要小的个数X 2.式子:$X=a_n*(n-1)!+a_{n-1}*(n-2)!+……+a_1*0!$,其中$a_i$表示第1位到第i-1位上的数字中,比第i位(从右往左数)数字的个数小的数量。 3.例子:如 {1、2、3、4}的一 ...
分类:
其他好文 时间:
2018-03-07 17:36:00
阅读次数:
156
恢复内容开始 洛谷P3014 [USACO11FEB]牛线Cow Line 关于康托展开 与 康托逆展开 恢复内容结束 ...
分类:
其他好文 时间:
2018-02-22 10:46:55
阅读次数:
151
八数码问题传送门 //Achen #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<vector> #include<queue> #include ...
分类:
其他好文 时间:
2018-01-30 12:39:17
阅读次数:
209
最近做到好多概率,组合数,全排列的题目,本咸鱼不会啊,我概率论都挂科了。。。 这个题学到了一个康托展开,有点用,瞎写一下。。。 康托展开: 适用对象:没有重复元素的全排列。 把一个整数X展开成如下形式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+ ...
分类:
其他好文 时间:
2018-01-22 16:05:45
阅读次数:
282
一、思路很简单,搜索。对于每一种状态,利用康托展开编码成一个整数。于是,状态就可以记忆了。 二、在搜索之前,可以先做个优化,对于逆序数为奇数的序列,一定无解。 三、搜索方法有很多。 1、最普通的:深搜、广搜。在这题里面,这两个方法直接TLE。所以,我后面没有贴超时的代码。 2、既然1超时,那就预处理 ...
分类:
其他好文 时间:
2017-12-03 16:23:44
阅读次数:
268
Permutation UVA - 11525 看康托展开 题目给出的式子(n=s[1]*(k-1)!+s[2]*(k-2)!+...+s[k]*0!)非常像逆康托展开(将n个数的所有排列按字典序排序,并将所有排列编号(从0开始),给出排列的编号得到对应排列)用到的式子。可以想到用逆康托展开的方法。 ...
分类:
编程语言 时间:
2017-11-25 18:29:46
阅读次数:
152
康托展开用来求数组是该全排列的第几项,康托展开的逆运用用于求全排列的第几个排列。 已知对于1-n个数的全排列,总共的可能是n!种。对于一个已知的数列比如45321,在第一项是4时,表示第一项在此之前已经填放过1 2 3了,而后面的第二项至第五项则又是一个全排列,那么此时的排列数就是3 * 4 !;第 ...
分类:
其他好文 时间:
2017-11-12 12:33:49
阅读次数:
119
1 #include <bits/stdc++.h> 2 using namespace std; 3 //康托展开求法: 4 //比如2143 这个数,求其展开: 5 //从头判断,至尾结束, 6 //① 比 2(第一位数)小的数有多少个->1个就是1,1*3! 7 //② 比 1(第二位数)小的 ...
分类:
其他好文 时间:
2017-10-27 23:04:09
阅读次数:
132