1. 程式人生 > >Uva 11077 Find the Permutation

Uva 11077 Find the Permutation

algorithm image brush 元素 fine for 之前 自己 %d

技術分享圖片

可以發現最優的方案就是一個循環節內互換。

所以一個有n個元素,c個循環節的置換的交換次數(最少)是n-c。

然後就可以遞推了,把i插入到前i-1個元素構成的置換中,要麽新成立一個循環,要麽加入到之前的任意循環中去。

所以f[i][j]=f[i-1][j]+f[i-1][j-1]*(i-1)

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define ll unsigned long long
ll f[25][25];
int n,k;

inline void init(){
	f[0][0]=1;
	for(int i=1;i<=21;i++)
	    for(int j=0;j<i;j++){
	    	f[i][j]=f[i-1][j];
	    	//i自己獨立形成一個循環 
	    	if(j) f[i][j]+=f[i-1][j-1]*(ll)(i-1);
	    	//i插入之前循環的任意一個位置 
		}
}

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

  

Uva 11077 Find the Permutation