hdu 3664 DP 遞推

思路:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章