题目:http://poj.org/problem?id=2279

书上的DP做法会爆内存,尝试写了一个,过了样例。

转载:

poj2279排队——杨氏矩阵与钩子公式(DP爆内存)

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll unsigned long long
using namespace std;
ll k,n[7],f[35][35][35][35][35];
void cl(ll a1,ll a2,ll a3,ll a4,ll a5)
{
    if(a1)f[a1][a2][a3][a4][a5]+=f[a1-1][a2][a3][a4][a5];
    if(a2)f[a1][a2][a3][a4][a5]+=f[a1][a2-1][a3][a4][a5];
    if(a3)f[a1][a2][a3][a4][a5]+=f[a1][a2][a3-1][a4][a5];
    if(a4)f[a1][a2][a3][a4][a5]+=f[a1][a2][a3][a4-1][a5];
    if(a5)f[a1][a2][a3][a4][a5]+=f[a1][a2][a3][a4][a5-1];
}
int main()
{
    while(scanf("%lld",&k)==1)
    {
        memset(f,0,sizeof f);
        memset(n,0,sizeof n);//!!!
        if(!k)return 0;
        for(ll i=1;i<=k;i++)
            scanf("%lld",&n[i]);
        f[0][0][0][0][0]=1;
        for(ll a1=0;a1<=n[1];a1++)
        {
            if(k>=2)
                for(ll a2=0;a2<=n[2]&&a2<=a1;a2++)
                {
                    if(k>=3)
                        for(ll a3=0;a3<=n[3]&&a3<=a2;a3++)
                        {
                            if(k>=4)
                                for(ll a4=0;a4<=n[4]&&a4<=a3;a4++)
                                {
                                    if(k>=5)
                                        for(ll a5=0;a5<=n[5]&&a5<=a4;a5++)
                                            cl(a1,a2,a3,a4,a5);
                                    else cl(a1,a2,a3,a4,0);
                                }
                            else cl(a1,a2,a3,0,0);
                        }
                    else cl(a1,a2,0,0,0);
                }
            else cl(a1,0,0,0,0);
        }
        printf("%lld\n",f[n[1]][n[2]][n[3]][n[4]][n[5]]);
    }
    return 0;
}
View Code

相关文章: