51Nod 1250 排列与交换】的更多相关文章

题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1250 仔细思考dp. 第一问,考虑已知 i-1 个数有多少种方案.再放入一个数,它是最大的且在最后面,所以它的位置不同的话,就是不同的方案.它在特定的位置,其余部分的值就是 i-1 的值. 所以再用前缀和优化成 n^2 即可.k可减任意个2. 第二问,还是像上面一样考虑.但新来的数只会和前面的数交换一次.任何一种交换 k ( k>1 ) 次的方案都可以转换成前面的…
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1250 看了半天... 把第一问想成逆序对的话似乎很容易想了,新加入一个数,可以往前挪动,增加的逆序对数就是它后面那些数的个数: 所以 f[i][j] = ∑(k = max( 0 , j - i + 1)) f[i-1][k],用前缀和即可: 第二问正好用第一类斯特林数: 第一类斯特林数 str[i][j] 表示把 i 个数分成 j 个环,环有顺序的方案数,str…
Description 统计 \(1...n\) 的排列,恰好进行 \(k\) 次相邻交换和至多进行 \(k\) 次交换生成的不同的序列个数. Sol DP. 好妙的题啊... 首先看第一个问题. 对于相邻元素的交换,我们建立状态 \(f[i][j]\) 表示前 \(i\) 个数进行 \(j\) 次交换的方案数. 我们分类来讨论 \(i\) 元素是否参与交换. 如果不参与交换 \(f[i][j]+=f[i-1][j]\) 如果参与交换,那么它最远能交换到的位置就是 \(i-j\) \(f[i][…
php实现字符串的排列(交换)(递归考虑所有情况) 一.总结 交换: 当有abc的时候,分别拿第一位和其它位交换,第一位固定,余下的位做递归,这样有考虑到所有情况,因为第一位只可能是所有的字母,那第一位依次和所有的位交换可以保证所有的位都可以出现在第一位,如果交换的时候要交换的字母和第一位字母相同,则不必交换. 二.php实现字符串的排列 题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac…
题意:有两个长度为n的排列p和s.要求通过交换使得p变成s.交换 pi 和 pj 的代价是|i-j|.要求使用最少的代价让p变成s. 考虑两个数字pi和pj,假如交换他们能使得pi到目标的距离减少,pj到目标的距离减少.那么应该交换他们,这是一个必要的操作,也是答案的下界. 如果每一次都能找到这样的两个数字,那么答案就是排列p中的每个数字在排列s的位置的距离差之和/2.这显然是答案的下界. 现在考虑证明这个下界是可以构造出来的. 考虑排列p中最后一个位置不对的数字,不妨设为pj,他的目标位置是p…
分析 猜了一下结论,居然对了..........具体操作是:假设排列s是1,2,3,...,nk为排列p中最大的 没有放到正确位置的数,k的位置为posk的右边一定有一个数x<=pos(因为<=pos的数有pos个,不可能全挤在pos-1个位置里)交换k和x,两个数都离目标更近了且没有走远路.重复这个步骤 猜了两次结论然后就对了??? #include <bits/stdc++.h> using namespace std; #define ll long long #define…
题解链接 不过求ggg不用O(n2)DPO(n^2)DPO(n2)DP,g[n]g[n]g[n]直接就是卡特兰数的第n−1n-1n−1项.即: g[n]=(2(n−1)n−1)−(2(n−1)n−2)g[n]=\binom{2(n-1)}{n-1}-\binom{2(n-1)}{n-2}g[n]=(n−12(n−1)​)−(n−22(n−1)​) 相当于在平面直角坐标系中,要从(0,0)(0,0)(0,0)走到(n,n)(n,n)(n,n),有一条线段y=x(x∈(0,n))y=x(x\in(0…
IComparable和ICompare 接口是.net framework 中比较对象的标准方式,这两个接口提供一个返回值类似(大于0 等于0 小于0)的比较方法,二者区别如下: . IComparable 在要比较的对象的类中实现,可以比较该对象和另一个对象. . IComparer 在一个单独的类中实现,可以比较任意两个对象. 先看 IComparable 这个接口方法是 int CompareTo(object obj); 方法只有一个参数,我们知道比较至少要有两个对象,所以这个方法只能…
把{1, 2, 3,,, n}叫做自然排列 本题便是求有多少个n元排列P要至少经过k次交换才能变为自然排列. 首先将排列P看做置换,然后将其分解循环,对于每个长度为i的循环至少要交换i-1次才能归位. 设有d(i, j)个i元排列至少交换j次才能变成自然排列. 则有d(i, j) = d(i-1, j) + d(i-1, j-1) * (i-1) 对于元素i有两种选择,自己成一个长度为1的循环,此时交换次数不变: 或者加到前面任意一个循环的任意一个位置,有i-1中情况,因为所加入的循环长度加一,…
题意:1-n的一个排列, p2, ..., pn,f(p)的定义是此排列要交换最少的数对能够回到原排列1,2,3,4...n.给一个排列p.要将其变换成f值为m的排列,问至少要交换几个数对,并输出字典序最小的那组答案. 解法:处理出全部的置换群,求出环数k,此时f值为n-k.然后推断n-k和m的大小,分为两种操作 1.加环,这个是在随意元素个数大于1的环内交换随意两个数都能够做到加环 2.减环,交换随意两个环的随意两个元素.就能够做到将两个环连接起来 题目要求是输出字典序最小,那么就暴力搞. 代…