思路:
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;
}