题意:
给出数列a[]=1~n, 共n个数,在数列中如果ai>i(i是下标), val++; 问当val=k时有几种数列(即n个数顺序不同)
dp[i][j]=dp[i-1][j]*(j+1)+dp[i-1][j-1]*(i-j);
dp[i][j]表示第i个数前边有j个位置aj>j, 即val=j;
dp[i-1][j]->dp[i][j]增加了j*dp[i-1][j]个, dp[i-1][j-1]->dp[i][j]是有(i-j)种val+1的方式;
所以有dp[i][j]=dp[i-1][j]*(j+1)+dp[i][j]*(i-j);
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
int N, k;
const long long mod=1e9+7;
long long dp[1005][1005];
int main(){
dp[1][0]=1;
for(int i=2; i<=1000; i++){
for(int j=0; j<=i; j++){
dp[i][j]=(dp[i-1][j-1]*(i-j)%mod+dp[i-1][j]*(j+1)%mod)%mod;
}
}
while(cin >> N >> k){
cout << dp[N][k] << endl;
}
return 0;
}
Permutation Counting HDU - 3664
最新推荐文章于 2020-08-23 15:33:20 发布