UVA10253 Series-Parallel Networks --- dp

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/lmhlmh_/article/details/100079484

蓝书p118

#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 40
using namespace std;
typedef long long ll;
ll f[MAXN];
ll d[MAXN][MAXN];

ll C(ll n,ll m) {
    double ret = 1;
    for(int i = n;i > n-m;i--) 
        ret *= i;
    for(int i = m;i >= 1;i--)
        ret /= i;
    return (ll)(ret+0.5);
}

int main() {
    f[1] = 1;
    memset(d,0,sizeof(d));

    for(int i = 0;i <= 30;i++) d[i][0] = 1;
    for(int i = 1;i <= 30;i++) {
        d[i][1] = 1;
        d[0][i] = 0;
    }
    int n = 30;

    for(int i = 1;i <= n;i++)
        for(int j = 2;j <= n;j++) {
            d[i][j] = 0;
            for(int p = 0;p*i <= j;p++) {
                d[i][j] += C(f[i]+p-1,p) * d[i-1][j-p*i];
            }
            f[i+1] = d[i][i+1];
        }
    

    while(scanf("%d",&n) == 1 && n) {
        printf("%lld\n",n==1?1:2*f[n]);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/lmhlmh_/article/details/100079484