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

Uva 11077 Find the Permutation

时间:2018-02-13 14:07:14      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:bre   iostream   ati   就是   while   uva   define   inline   body   

技术分享图片

可以发现最优的方案就是一个循环节内互换。

所以一个有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

标签:bre   iostream   ati   就是   while   uva   define   inline   body   

原文地址:https://www.cnblogs.com/JYYHH/p/8446474.html

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