HDU 2512 一卡通大冒险

HDU 2512 一卡通大冒险_第1张图片 

假设 dp[i][j] 为有 i 张卡片分给 j 个人的种类数

先来看一个例子

当有 3 张卡片时时,{{A},{B},{C}} , {{A,B},{C}}, {{B,C},{A}}, {{A,C},{B}} ,{{A,B,C}} 

我们取分给 3 个人

此时加一张卡片,也就是有 4 张卡篇分给 3 个人

第 4 张卡片可以在 {{A,B},{C}}, {{B,C},{A}}, {{A,C},{B}} 这三个集合中插入一个新元素

也可以在  {{A},{B},{C}}  内与其他字母构成新集合,取决于集合内的元素个数

所以  dp[i][j]=dp[i-1][j-1]+dp[i-1][j]*j

const int N=2000+5;
 
    int n,m,t;
    int i,j,k;
    int a[N];
    int dp[N][N];

int main()
{
    //IOS;
    dp[1][1]=1;
    dp[2][1]=1;
    dp[2][2]=1;
    for(i=3;i<=2000;i++){
        for(j=1;j<=i;j++){
            dp[i][j]=(dp[i-1][j-1]+dp[i-1][j]*j)%1000;
        }
    }
    rush(){
        sd(n);
        int ans=0;
        for(i=1;i<=n;i++){
            ans+=dp[n][i];
            ans%=1000;
        }
        pd(ans);
    }
   // PAUSE;
    return 0;
}

 

你可能感兴趣的:(#,动态规划,HDU)