hdu 3664 Permutation Counting

题意:一个序列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 }
原文地址:https://www.cnblogs.com/hhxj/p/7569656.html