

包含两个整数,并用一个空格隔开,第一个整数表示实施魔法的次数m,第二个整数表示空间的维数n。其中,1≤m≤100,1≤n≤15。
仅包含一个整数,表示花仙子在n维空间中实施了m次魔法后,最多能得到多少种不同的花。
dp。
题意相当于在放置m个n维球,最多把n维空间分成几个部分。
f[i][j]表示在i维空间放置j个i维球最多把空间分成几个部分。
f[i][j]=f[i][j-1]+f[i-1][j-1]
考虑放入第j个球时,已经分成了f[i][j-1]个空间;
因为i维球与i维球相交的部分会变成i-1维(线线相交为点,面面相交为线...),第j个球最多会与j-1个球相交,因此就是f[i-1][j-1]。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define LL long long
using namespace std;
int n,m;
LL f[105][105];
int main()
{
scanf("%d%d",&m,&n);
for (int i=1;i<=m;i++)
f[1][i]=i*2;
f[2][1]=2;
for (int i=2;i<=n;i++)
for (int j=2;j<=m;j++)
{
if (j==1) f[i][j]=4;
else f[i][j]=f[i][j-1]+f[i-1][j-1];
}
cout<<f[n][m]<<endl;
return 0;
}
感悟:
1.WA是因为初始化写错
2.初始化中f[1][i]为什么等于2*i?因为在一条直线上,每次加入两个端点,最多能多把直线分出两个部分(“部分”与题意中一致)
原文:http://blog.csdn.net/regina8023/article/details/43935475