Uva 11077 Find the Permutation
阿新 • • 發佈:2018-02-13
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