码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-02-25 11:44:27      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:bzoj   oi   dp   

1197: [HNOI2006]花仙子的魔法

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

Description

技术分享

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

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

标签:bzoj   oi   dp   

原文地址:http://blog.csdn.net/regina8023/article/details/43935475

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!