第五届山东省ACM Hearthstone II(Dp)

Hearthstone II

n场比赛,m个场地,m<=n,1场比赛只能选择1个场地,要求每个场地必须使用过一次,求所有的方案数。

dp[i][j]表示:前i场比赛用了j个场地的情况数

dp[i][j]=dp[i-1][j]*j+dp[i-1][j-1]*(m-j+1);

#include<iostream>  
#include<stdio.h>  
#include<string.h>  
using namespace std;  
  
const int MOD=1e9+7;  
  
int main(){  
  
    int n,m;  
    long long dp[105][105];//dp[i][j]表示:前i场比赛用了j个场地的情况数  
    int i,j;  
  
    while(~scanf("%d%d",&n,&m)){  
        memset(dp,0,sizeof(dp));  
        for(i=1;i<=n;++i) //j=1;前i场比赛用了1个场地,初始化为m  
            dp[i][1]=m;  
        for(i=2;i<=n;++i){  
            for(j=2;j<=i&&j<=m;++j){  
                dp[i][j]=((dp[i-1][j]*j)%MOD+(dp[i-1][j-1]*(m-j+1))%MOD)%MOD;  
            }  
        }  
        printf("%lld\n",dp[n][m]);  
    }  
  
    return 0;  
}  


你可能感兴趣的:(第五届山东省ACM Hearthstone II(Dp))