uva-11077

思路:dp[i][j]代表1-i的排列(未排好)至少经过j次操作才能1-i的有序序列,对于dp[i][j]它的答案由两部分组成,要么第i个数自己保持不动(即dp[i-1][j])要么和前面某一个数交换(即dp[i-1][j-1]),初态是dp[1][0]=1;

#include<bits/stdc++.h>
#define _for(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int mod =1e6+7;
double esp=1e-6;
int INF =0x3f3f3f3f;
const int inf = 1<<28;
const int MAXN=5e6+10;
unsigned long long f[100][100];
int main()
{
    memset(f,0,sizeof(f));
    f[1][0]=1;
    for(int i=2;i<=23;i++)
    {
        for(int j=0;j<i;j++)
        {
            f[i][j]=f[i-1][j];
            if(j>0)f[i][j]+=f[i-1][j-1]*(i-1);
        }
    }
    int n,k;
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        if(n==0)break;
        printf("%llu
",f[n][k]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/kayiko/p/12290996.html