HDU POJ 1190 生日蛋糕 dfs + 剪枝

原创 2016年08月30日 23:11:32

题目链接:poj 1190






题解:这题刚开始想不到搜索的初始状态,没办法下手,迷迷糊糊的,后来就想着 按照给定n的初始入手,吧未放置的第0层看成一个圆,不是立体,高度也设为n + 1, 然后 从下往上找。。。。 想这个思路 花了太长时间   。。。。虽然是一发a但是感觉 自己对搜索的理解 太浅  能力还是要提高啊



AC code:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>

using namespace std;

#define debug 0
#define INF 0x3f3f3f3f

const int maxn = 20 + 5;
int n, m;
int minv[maxn], ans;

void dfs(int v, int deep, int r, int h, int temp)//v:当前剩余体积,deep层数,r,h:半径,高的范围
{
	if (deep == 0)
	{
		if (v == 0 && temp < ans)
			ans = temp;//更新最小值
		return;
	}

	if (v - minv[deep - 1] < 0 || temp >= ans || 2 * v / r + temp >= ans)//2*v/r+temp>=ans 当前解+剩余资源的最优解>=最优解
		return;
	for (int R = r - 1; R >= deep; R--)//枚举半径
	{
		int MH = min(h - 1, (v - minv[deep - 1]) / R / R);//取两者较小者
		for (int H = MH; H >= deep; H--)//枚举高
		{
			if (v - R * R * H >= 0)
			{
				if (deep == m)
					temp = R * R;
				temp += 2 * R * H;
				dfs(v - R * R * H, deep - 1, R, H, temp);
				temp -= 2 * R * H;//返回递归前状态
				if (deep == m)
					temp = 0;
			}
		}
	}
}
int main()
{
#if debug
	freopen("in.txt", "r", stdin);
#endif //debug
	minv[0] = 0;
	for (int i = 1; i <= 20; i++)
		minv[i] = minv[i - 1] + i * i * i;  //从上到下前i层蛋糕需要的最小体积

	while (~scanf("%d%d", &n, &m))
	{
		ans = INF;
		dfs(n, m, (int)sqrt(n) + 1, n + 1, 0);

		if (ans == INF)
			ans = 0;

		printf("%d\n", ans);
	}
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

poj 1190 生日蛋糕(深搜+剪枝技巧)

poj 1190 生日蛋糕(深搜+剪枝技巧)
  • PKU_ZZY
  • PKU_ZZY
  • 2016年05月25日 19:53
  • 2215

生日蛋糕POJ 1190

POJ 生日蛋糕(Tag 深搜 + 剪枝) DFS 剪枝优化 极限思想
  • lvxin1204
  • lvxin1204
  • 2016年04月13日 23:57
  • 338

POJ 1190 生日蛋糕(dfs)

Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体。 设从下往上数第i(1 Ri+1且Hi > Hi+1。 由于要...
  • V5ZSQ
  • V5ZSQ
  • 2015年08月23日 15:05
  • 1612

poj 1190 生日蛋糕(dfs, 剪枝)

剪枝.... 参考博客点击打开链接 由于深度一定(m),所以使用深度优先搜索,自上而下的设定蛋糕序号,最顶层的为第1层,……,最底层的蛋糕为第m层,很明显满足题目条件的前i层的(从顶层(也就是编号...
  • CillyB
  • CillyB
  • 2016年11月10日 17:55
  • 149

poj 1190 生日蛋糕(dfs 剪枝)

剪枝十分神奇
  • W1413882708
  • W1413882708
  • 2016年09月10日 17:28
  • 167

poj 1190 生日蛋糕 dfs剪枝

/* 大神的剪枝。。。 估计好下界 进行剪枝。 2*v/R+tmp>=ans; 2*v/R为估计的剩下的能表面积下界。。虽然这个下界是不可达的, */ #include ...
  • qq403977698
  • qq403977698
  • 2012年10月04日 17:41
  • 230

Poj 1190 生日蛋糕 (DFS 剪枝)

隐约记得前几年网络赛有过类似的题,当时毫无想法…… 参考了:http://blog.csdn.net/lencle/article/details/7016191 可能还能进一步优化,可以参考:h...
  • whyorwhnt
  • whyorwhnt
  • 2014年01月21日 10:26
  • 691

poj 1190 生日蛋糕 dfs 剪枝

什么都不说了 貌似别人分类是简单题..自己照着别人的代码写的  自己写的tle了  简单的剪枝 效果这么明显...................  开始自己还求了j的下限 结果还不如不求了 直接j>...
  • sooowhat
  • sooowhat
  • 2011年06月12日 14:31
  • 298

poj 1190 dfs(生日蛋糕)

这道题说是DFS基础题,但是对我来说还是很纠结,o(︶︿︶)o 唉,还是太水了。。。 解题报告思路参考了这个百度空间。 http://apps.hi.baidu.com/share/detail/...
  • a402630999
  • a402630999
  • 2012年01月18日 01:39
  • 236

POJ 1190 生日蛋糕 (dfs + 神剪枝)

POJ 1190 有三处剪枝,作为渣渣表示这题对我来说很有难度。题解也是看了好久才理解。 首先,minv[i] 表示从上往下数第i层以及第i层以上的最小总体积,mins[i]表示从...
  • Strokess
  • Strokess
  • 2016年03月29日 16:17
  • 577
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU POJ 1190 生日蛋糕 dfs + 剪枝
举报原因:
原因补充:

(最多只允许输入30个字)