题目:http://poj.org/problem?id=2279
书上的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; }