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;
}



posted @ 2011-11-19 19:55  快乐.  阅读(161)  评论(0编辑  收藏  举报