hdu1292 组合数学+递推

p[i][j] = p[i-1][j-1] + p[i-1][j] * j表示i个人分为j队,p[i-1][j-1]表示第i个人并入已有队列,p[i-1][j]*j表示第i个人单独成一队。

#include <iostream>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>

using namespace std;
long long p[26][26];

int main()
{
    int t;
    memset(p , 0 ,sizeof(p));
    p[1][1] = 1;
    for(int i = 2 ; i < 26 ; i ++ )
    {
        for(int j = 1 ; j <= i ; j ++ )
        {
           if(i == j)
           {
               p[i][j] = 1;
               continue;
           }
           p[i][j] = p[i-1][j-1] + p[i-1][j] * j;
        }
    }
    cin >> t;
    while(t --)
    {
        int n;
        cin >> n;
        long long sum = 0;
        for(int i = 1 ; i <= n ; i ++ ) sum += p[n][i];
        cout << sum << endl;
    }
    return 0;
}


你可能感兴趣的:(hdu1292 组合数学+递推)