bzoj 1197 DP

  我们可以将这个问题转化为在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;
}
原文地址:https://www.cnblogs.com/BLADEVIL/p/3591324.html