您的位置:首页 > 其它

UVA 11077 Find the Permutations 置换+递推

2013-08-07 16:09 375 查看
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
#define LL unsigned long long
LL f[33][33];
int main()
{
    int n,k;
    memset(f,0,sizeof(f));
    f[1][0]=1;
    for(int i=2;i<=21;i++)
    {
        f[i][0]=f[i-1][0];
        for(int j=1;j<i;j++)
            f[i][j]=f[i-1][j]+f[i-1][j-1]*(i-1);
    }
    while(cin>>n>>k)
    {
        if(n==0&&k==0)
            break;
        cout<<f
[k]<<endl;
    }
    return 0;
}
/*
    每个长度为n循环需要交换n-1次才能将交换到对应的位置,例如1->2,2->4,4->1,(1,2,4)位置上对应值为(2,4,1)
相当于一个长度为3的环逆时针旋转了1格,要变换回来,需要跟原位置交换,因为成环,所以共n-1次
    那么对于序列P,有x个循环节,长度为n,就需要交换n-x次
    对于f[i][j],表示交换j次能变为1~i的序列的种数
    我们找到递推式:f[i][j]=f[i-1][j]+f[i-1][j-1]*(i-1),边界是f[1][0]=1,其余为0
    解释:新增的i,如果与自己构成循环,那么循环数和长度都加一,交换数不变,所以是f[i-1][j]
        新增的i,如果参加到其他环中,每个数后一种,共i-1种,循环数不变,长度加一,所以是f[i-1][j-1]*(i-1)
    例如1->2,2->3,3->1,{2,3,1};将4添加到1后就是1->4,4->2,2->3,3->1,序列为{4,3,1,2};其他同上
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: