我现在正在处理一个问题而且遇到了一些麻烦。
以下是问题:
我已经在程序中找到了一个点,我可以为给定的长度生成所有可能的行,并且可以计算彼此对齐的其他行的数量。我可以相当快地计算基本情况,但我的程序非常天真并且递归地计算墙,每个可能的行作为墙的基础并且在每个可能的叶组合上递归地构建墙。由于你可以成像,这不是很有效,对于高于6的任何东西,我的程序需要非常长的时间。
我之前在论坛上看到过这个问题,但是我的问题没有得到真正回答,我无法回复。非常感谢帮助/想法。
哦,我正在用c ++编写程序。
编辑:我遇到了很多麻烦,有人可以查看我的代码并建议改进吗?EDIT2:好的,我现在有一个答案,我可以获得806844323190414可能的墙壁,用于48x10英寸的墙壁。如果有人想要,我可以发布我的方法/代码,或只是一般建议。
答案 0 :(得分:4)
听起来像动态编程
http://en.wikipedia.org/wiki/Dynamic_programming
http://www.topcoder.com/tc?d1=tutorials&d2=dynProg&module=Static
答案 1 :(得分:1)
我认为这是一个分而治之的问题,你给出了其他面板尺寸的一些例子,为什么不看看有多少种方法可以使用更小的面板构建48x10面板,然后寻找赢得的组合沿着较小面板的边缘工作。
答案 2 :(得分:1)
例如:第一行仅允许第二行的某些星座。但是如果有第三行看起来像第一行中的第三行,则第二行具有与第一行相关的所有变体。
答案 3 :(得分:1)
观察当你构建 k 行时,它只是最上面的( k )行限制下一行的样子。考虑一下这个问题“当我构建 k 行并且最上面的行看起来像 x 时,我可以用多少种方法构建剩余的墙?”这可以通过询问相同的问题来解决所有兼容的方法来制作 k + 1 行并对结果求和。对于构建第一行的所有可能方式,问题的答案总和是“当我构建了一行并且最上面的行看起来像 x ”时的问题的答案的总和。可以使用memoization或dynamic programming来解决此问题。
答案 4 :(得分:1)
如果有 n 放置单行的方法,那么让 1 为 n x 1 矢量的。通过 n 邻接矩阵 A 形成 n ,如果模式 i A_ij保持零>和 j 共享一个垂直边(不能彼此相邻),否则一个。很明显, A 的主要对角线用零填充。
现在,解决方案是常态
x' pow(A,身高-1) x
其中 x'是转置,pow(A, height-1)
是矩阵指数。