【BZOJ 1197】 [HNOI2006]花仙子的魔法

1197: [HNOI2006]花仙子的魔法

Time Limit: 10 Sec   Memory Limit: 162 MB
Submit: 771   Solved: 448
[ Submit][ Status]

Description

【BZOJ 1197】 [HNOI2006]花仙子的魔法_第1张图片

Input

包含两个整数,并用一个空格隔开,第一个整数表示实施魔法的次数m,第二个整数表示空间的维数n。其中,1≤m≤100,1≤n≤15。

Output

仅包含一个整数,表示花仙子在n维空间中实施了m次魔法后,最多能得到多少种不同的花。

Sample Input

3 1

Sample Output

6


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?因为在一条直线上,每次加入两个端点,最多能多把直线分出两个部分(“部分”与题意中一致)

你可能感兴趣的:(dp,OI,bzoj)