思路:
dp[i][j] 表示序列长度是i的情况下,k-value 是j 的排列数。
j可以通过上一层的两种状态转移而来。
一是上一层已经是j的,只能在最后插入或者找ai>i的置换。
二是上层是j-1的,那么可以找出ai<=i的进行置换,一共是i-(j-1)种。
递推关系式是dp[i][j] = dp[i-1][j]*(j+1) + dp[i-1][j-1]*(i-j);
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
const int N = 1005;
ll dp[N][N];
ll mod = 1000000007;
int main()
{
int n,k;
for ( int i=0; i<N; i++ )
dp[i][0] = 1 ;
dp[0][0] = 0;
for( int i=1; i<N; i++ ) {
for ( int j=1; j<i; j++ ) { // k < n
dp[i][j] = ((dp[i-1][j]*(j+1))%mod + (dp[i-1][j-1]*(i-j))%mod )%mod;
}
}
while( cin>>n>>k ) {
cout<<dp[n][k]<<endl;
}
return 0;
}