简单的dp 动态方程如下:
dp[n][k] = ( (k+1) * dp[n-1][k] + (n-k) * dp[n-1][k-1] )
#include <stdio.h>
#define MAXN 1001
#define csMax 1000000007
long long dp[MAXN][MAXN];
void initial();
int main()
{
int n, k;
initial();
while (2 == scanf("%d %d", &n, &k))
{
printf("%lld\n", dp[n][k]);
}
return 0;
}
void initial()
{
int n, k;
for (n = 0; n <= MAXN; ++n)
{
dp[n][0] = 1;
}
for (n = 1; n != MAXN; ++n)
{
for (k = 1; k <= n; ++k)
{
dp[n][k] = ( (k+1) * dp[n-1][k] + (n-k) * dp[n-1][k-1] ) % csMax;
}
}
}