包含两个整数,并用一个空格隔开,第一个整数表示实施魔法的次数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