题意:一个序列A的值为A[i]>i的个数,问给出n,m,使得n个数排列值为m的个数
思路:dp,dp[i][j],相当于i个数价值为j,那么我是不是可以把第i个数放到第i个位置(即dp[i-1][j],还可以把i-1个数产生价值的位置和i换一下,价值不变(即dp[i-1][j]*j),还可以从dp[i-1][j-1]让那么不产生价值的位置和i换,价值+1
dp[i][j]=dp[i-1][j]+dp[i-1][j]*j+dp[i-1][j-1)*(i-1-(j-1));
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const ll mod=1e9+7; 5 6 ll dp[1010][1010]; 7 8 int main(){ 9 for(int i=1;i<=1000;i++){ 10 dp[i][0]=1; 11 for(int j=1;j<i;j++){ 12 dp[i][j]=(dp[i-1][j]+dp[i-1][j]*j%mod+dp[i-1][j-1]*(i-j)%mod)%mod; 13 } 14 } 15 int n,m; 16 while(~scanf("%d%d",&n,&m)){ 17 cout<<dp[n][m]<<endl; 18 } 19 }