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

UVa11077

时间:2017-10-24 00:05:25      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:type   amp   long   sig   也有   name   排列   return   printf   

dp+置换

可以把排列分成几个循环,然后dp统计

dp[i][j]=dp[i-1][j-1]*(i-1)+dp[i-1][j],表示当前有i个元素,至少换j次,然后如果不在自己应该在的位置有i-1种情况,在自己位置上有1种情况,转移即可

话说vjudge也有100AC了。。。

技术分享
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef unsigned long long ull;
const int N = 22;
int n, k;
ull dp[N][N];
int main()
{
    dp[1][0] = 1;
    for(int i = 2; i < 22; ++i)
        for(int j = 0; j < 22; ++j) dp[i][j] = (ull)(i - 1) * dp[i - 1][j - 1] + dp[i - 1][j];
    while(scanf("%d%d", &n, &k) && (n != 0 || k != 0)) printf("%llu\n", dp[n][k]);
    return 0;
}
View Code

 

UVa11077

标签:type   amp   long   sig   也有   name   排列   return   printf   

原文地址:http://www.cnblogs.com/19992147orz/p/7719639.html

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