【找规律】【DFS】Gym - 101174H - Pascal's Hyper-Pyramids
二维下,如果把杨辉三角按照题目里要求的那样摆放,容易发现,第i行第j列的数(从0开始标号)是C(i+j,i)*C(j,j)。
高维下也有类似规律,比如三维下,最后一层的数其实是C(i+j+k,i)*C(j+k,j)*C(k,k)。
题目提示你了,坐标组合相同的位置,其值一定相同。
于是dfs最后一层的序号组合,统计答案即可。我只加了一个可行性剪枝,应该还能加一个的。
#include<cstdio> #include<set> using namespace std; typedef long long ll; ll C[40][40]; set<ll>S; int vn[35]; int n,D; void dfs(int cur,int last,int now){ if(now>=n-1 && cur<=D){ return; } if(cur>D){ if(now==n-1){ ll tmp=1; int tnow=now; for(int i=1;i<=D;++i){ tmp*=C[tnow][vn[i]]; tnow-=vn[i]; } S.insert(tmp); } return; } for(int i=last;i<=n;++i){ vn[cur]=i; dfs(cur+1,i,now+i); vn[cur]=0; } } int main(){ C[0][0]=1; for(int i=1;i<=31;++i){ for(int j=0;j<=i;++j){ C[i][j]=C[i-1][j]; if(j-1>=0){ C[i][j]+=C[i-1][j-1]; } } } // for(int i=0;i<=31;++i){ // for(int j=0;j<=i;++j){ // printf("%I64d ",C[i][j]); // } // puts(""); // } scanf("%d%d",&D,&n); dfs(1,0,0); for(set<ll>::iterator it=S.begin();it!=S.end();++it){ printf("%I64d\n",*it); } return 0; }
——The Solution By AutSky_JadeK From UESTC
转载请注明出处:http://www.cnblogs.com/autsky-jadek/