http://acm.hdu.edu.cn/showproblem.php?pid=3664
题意:给出数字n,问n的所有的排列中满足Ai>i 数字恰好为 k的排列的个数。
sl : dp
dp【n】【k】 = dp【n-1】【k】*(k+1) + dp【n-1】【k-1】*(n-1-k+1);
为什么? 稍微一想就知道了。
1 #include <cstdio>
2 #include <cstring>
3 #include <algorithm>
4 #include <vector>
5 using namespace std;
6 const int MAX= 1000;
7 const int MOD = 1e9+7;
8 typedef long long LL;
9 int dp[MAX][MAX];
10 int main() {
11 int n,k;
12 while(scanf("%d %d",&n,&k)==2) {
13 memset(dp,0,sizeof(dp));
14 for(int i=1;i<=n;i++) dp[i][0]=1;
15 for(int i=1;i<=n;i++) {
16 for(int j=1;j<=i;j++) {
17 dp[i][j]=((LL)dp[i-1][j]*(j+1)+(LL)dp[i-1][j-1]*(i-j))%MOD;
18 }
19 }
20 printf("%d ",dp[n][k]);
21 }
22 return 0;
23 }
2 #include <cstring>
3 #include <algorithm>
4 #include <vector>
5 using namespace std;
6 const int MAX= 1000;
7 const int MOD = 1e9+7;
8 typedef long long LL;
9 int dp[MAX][MAX];
10 int main() {
11 int n,k;
12 while(scanf("%d %d",&n,&k)==2) {
13 memset(dp,0,sizeof(dp));
14 for(int i=1;i<=n;i++) dp[i][0]=1;
15 for(int i=1;i<=n;i++) {
16 for(int j=1;j<=i;j++) {
17 dp[i][j]=((LL)dp[i-1][j]*(j+1)+(LL)dp[i-1][j-1]*(i-j))%MOD;
18 }
19 }
20 printf("%d ",dp[n][k]);
21 }
22 return 0;
23 }
24 //dp[n][k]=dp[n-1][k]*(k+1)+dp[n-1][k-1]*(n-1-k+1);