【发布时间】:2010-10-29 03:39:54
【问题描述】:
“假设你想用一排 4×1 和 6×1 的乐高积木拼成一个实心面板。为了结构强度,积木之间的空间绝不能在相邻的行中排列。例如,18×下面显示的 3 面板是不可接受的,因为顶部两行中的块之间的空间是对齐的。
构建 10×1 面板有 2 种方法,构建 10×2 面板有 2 种方法,构建 18×3 面板有 8 种方法,构建 36×5 面板有 7958 种方法。
构建 64×10 面板有多少种不同的方法?答案将适合 64 位有符号整数。编写程序计算答案。你的程序应该运行得非常快——当然,它不应该超过一分钟,即使在旧机器上也是如此。让我们知道您的程序计算的值,您的程序计算该值所用的时间,以及您在哪种机器上运行它。包括程序的源代码作为附件。 "
我最近收到了一个编程难题,并且一直在绞尽脑汁试图解决它。我使用 c++ 编写了一些代码,我知道这个数字很大......我的程序运行了几个小时,然后我决定停止它,因为即使在慢速计算机上也需要 1 分钟的运行时间。有没有人见过类似的谜题?已经有几个星期了,我不能再提交了,但这真的让我很烦恼,我无法正确解决它。关于使用算法的任何建议?或者也许可能的解决方法是“开箱即用”。我采用的是制作一个程序,该程序构建每个可能的 4x1 和 6x1 块“层”以制作 64x1 层。结果证明有大约 3300 个不同的层。然后我让我的程序运行并将它们堆叠到所有可能的 10 层高墙上,这些墙没有排列的裂缝......正如你所看到的,这个解决方案需要很长时间。所以很明显,蛮力似乎并不能在时间限制内有效地解决这个问题。任何建议/见解将不胜感激。
【问题讨论】:
-
这里应该有图片吗?我没有看到。我猜这是因为你不能发布图片,除非你有超过 15 个 Rep。
-
整数分区可能是解决方案的一部分:en.wikipedia.org/wiki/Integer_partition
-
我认为您的 3,300 数字是错误的,根据我编写的程序,它接近 47,000。也许你没有考虑到顺序。
-
@Pax:不,他是对的。 3328 种方式。 (不是基于程序,而是简单的组合)有 10 种方法来拥有 1 个四板和 10 个六板。有 495 种方法可以有 4 个四板和 8 个六板(495 == 12 选择 4)。 7个四板和6个六板有1716种方式(1716 == 13选7)。等等。继续将四板的数量增加 3,将六板的数量减少 2。然后将所有可能性相加:10 + 495 + 1716 + 1001 + 105 + 1 = 3228。(我的意思是“选择",见en.wikipedia.org/wiki/Combination)
-
@Daniel,我发现我的代码 (PEBCAK) 有问题。一个小改动,1x4+10x6有11种排列方式。除此之外,你的数字是正确的。
标签: language-agnostic dynamic-programming