码迷,mamicode.com
首页 > 其他好文 > 详细

uva 11077 - Find the Permutations(置换)

时间:2014-08-13 13:11:16      阅读:275      评论:0      收藏:0      [点我收藏+]

标签:style   http   color   os   io   for   ar   amp   

题目链接:uva 11077 - Find the Permutations

题目大意:给定一个1~n的排序,可以通过一系列的交换变成12,n, 给定n和k,统计有多少个排列至少需要交换k次才能变成有序的序列。

解题思路:给定一个序列P,可以将该序列看做是一个置换,从有序序列,开始,需要多少次回到有序序列。将P的循环分解,循环长度为1的需要0次,长度为2的需要1次,循环长度为n的需要n-1次,如果P的长度为N,有x个不相干的循环,那么总的需要的交换即为N-x。
所以有状态f(i,j),即为长度i,j个循环的寻列总数,f(i,j)=f(i?1,j?1)?(i?1)+f(i?1,j)

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
typedef unsigned long long ll;
const int maxn = 21;

ll f[maxn+5][maxn+5];

int main () {
    memset(f, 0, sizeof(f));
    f[1][0] = 1;
    for (int i = 2; i <= maxn; i++) {
        for (int j = 0; j < i; j++) {
            f[i][j] = f[i-1][j];
            if (j)
                f[i][j] += f[i-1][j-1] * (i-1);
        }
    }

    int n, k;
    while (scanf("%d%d", &n, &k) == 2 && n + k) {
        printf("%llu\n", f[n][k]);
    }
    return 0;
}

uva 11077 - Find the Permutations(置换),布布扣,bubuko.com

uva 11077 - Find the Permutations(置换)

标签:style   http   color   os   io   for   ar   amp   

原文地址:http://blog.csdn.net/keshuai19940722/article/details/38533737

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!