我们可以将这个问题转化为在n维空间中一共放m个n维球,求这m个球最多将这个空间分为不同的几个部分。
那么我们设w[i][j]代表i为空间放j个球分为的部分,那么w[i][j]=w[i][j-1]+w[i-1][j-1],我们考虑当前第j个球所产生的新的部分,在n维空间中,放一个n维球,这个球和其他n维球的相交的部分会降维变成n-1维,类似于3维空间球体相交部分为面,那么我们新加这个球最多可以和剩下的j-1个球都相交,且相交的部分为i-1维,那么这个问题就转化成了在i-1维中,j-1个球最多将这个空间分成多少部分,也就是w[i-1][j-1]。
/************************************************************** Problem: 1197 User: BLADEVIL Language: C++ Result: Accepted Time:0 ms Memory:808 kb ****************************************************************/ //By BLADEVIL #include <cstdio> #define LL long long #define maxm 101 using namespace std; int n,m,i,j; LL w[2][maxm]; int main() { scanf("%d%d",&m,&n); w[0][1]=w[1][1]=2; for (i=1;i<=m;i++) w[1][i]=2*i; for (i=2;i<=n;i++) for (j=2;j<=m;j++) w[i%2][j]=w[i%2][j-1]+w[(i+1)%2][j-1]; printf("%lld ",w[n%2][m]); return 0; }