1. 程式人生 > 其它 >uva11077 Find the Permutations(置換+遞推)

uva11077 Find the Permutations(置換+遞推)

https://vjudge.net/problem/UVA-11077

題意:

給定n和k,問有多少n的排列能夠通過至少k次交換變成{1,2,3,……n}

一個排列P變成{1,2,3,……n}所需的最少交換次數 等於{1,2,3,……n}變成P所需的最少交換次數

把P理解為一個置換,分解為迴圈

含c個元素的迴圈需要交換c-1次

設f(i,j)表示至少需要j次交換變成{1,2,……n}的排列個數

元素i要麼自己構成迴圈,要麼加入前面任意一個迴圈的數後面

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

#include<bits/stdc++.h>

using namespace
std; unsigned long long f[22][22]; int main() { f[1][0]=1; for(int i=2;i<=21;++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)) { if(!n && !k) return
0; cout<<f[n][k]<<'\n'; } }
作者:xxy 出處:http://www.cnblogs.com/TheRoadToTheGold/ 本文版權歸作者和部落格園共有,轉載請用連結,請勿原文轉載,Thanks♪(・ω・)ノ。