UVa11077
Posted 123456
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa11077相关的知识,希望对你有一定的参考价值。
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; }
以上是关于UVa11077的主要内容,如果未能解决你的问题,请参考以下文章
UVA11077 Find the Permutations
Uva 11077 Find the Permutation