题目:1~n的全排列,每种排列中,ai > i的元素个数k为E-value,求E-value为k的排列个数。
分析:动态规划(dp)。
状态定义:f(n,k)为n个元素,E-value为k的排列个数;
转移方程:f(n,k)= f(n-1,k)* 1 —————— 放在最后
+ f(n-1,k)* k —————— 放在最后和ai>i的元素交换
+ f(n-1,k-1)*(n-k)——— 放在最后和ai≤i的元素交换
说明:ε=(´ο`*)))唉。
#include <stdio.h>
#include <stdlib.h>
long long dp[1001][1001];
int main()
{
for (int i = 1; i < 1001; ++ i) {
dp[i][0] = 1;
for (int j = 1; j < 1001; ++ j) {
dp[i][j] = (dp[i-1][j]*(1+j) + dp[i-1][j-1]*(i-j))%1000000007;
}
}
int n, k;
while (~scanf("%d%d", &n, &k)) {
printf("%lld\n", dp[n][k]);
}
return 0;
}