HDU 3664
http://acm.hdu.edu.cn/showproblem.php?pid=3664
DP
代码
三种情况
dp[i][j]表示i个数中E为 j 的个数 加入第 i+1个数时 有三种情况 1.第 i+1个数放在最后 为dp[i-1][j] 2. i+1个数 和 a[i]>i的数交换 dp[i-1][j]*j 3.i+1个数和 a[i]<=i 的数交换
dp[i-1][j-1]*[i-j] 则状态转移方程为 dp[i][j]=(dp[i-1][j]+dp[i-1][j]*j+dp[i-1][j-1]*(i-j))mod 1000000007;
#include<iostream>
using namespace std;
long long dp[1002][1002];
void cal()
{
int i,j;
for(i=1;i<1002;i++)
dp[i][0]=1;
for(i=1;i<1002;i++)
for(j=1;j<=i;j++)
dp[i][j]=(dp[i-1][j]
+dp[i-1][j]*j+dp[i-1][j-1]*(i-j))%1000000007;
}
int main()
{
int N,K,i,j;
cal();
while(scanf("%d%d",&N,&K)!=EOF)
{
printf("%I64d\n",dp[N][K]);
}
return 0;
}