本文主要是介绍UVa 11077 Find the Permutations / 置换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
把一个排列p变成1,2,...,n可以反过来看成1,2,...,n到p
把p分解乘循环 如果一个循环有n个元素 需要n-1次交换
dp[i][j] = dp[i-1][j] + dp[i-1][j-1] * (i-1); 代表i个元素 交换j次变成1,2,...,n,的种数
对于元素i 他可以自己成为一个循环那么交换次数不变 种数+1 就是 dp[i-1][j]
加入前面任意循环的任一个位置 有i-1中 就是dp[i-1][j-1]*(i-1);
#include <cstdio>
#include <cstring>const int maxn = 30;
unsigned long long dp[maxn][maxn];int main()
{memset(dp, 0, sizeof(dp));dp[1][0] = 1;for(int i = 2; i <= 21; i++){for(int j = 0; j < i; j++){dp[i][j] = dp[i-1][j];if(j > 0)dp[i][j] += dp[i-1][j-1] * (i-1);}}int n, k;while(scanf("%d %d", &n, &k) == 2 && n)printf("%llu\n", dp[n][k]);return 0;
}
这篇关于UVa 11077 Find the Permutations / 置换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!