动态编程平铺

时间:2012-04-14 15:27:37

标签: c algorithm dynamic-programming

http://www.spoj.pl/problems/GNY07H/ 在这个问题中,我们必须找到在4Xw(w> = 1)矩形中排列2X1瓦片的多种方法? 我已经尝试过这个问题并给了它很多时间,但却无法提出任何解决方案。如何处理这类问题。意思是如何让dp重复出现。 ?

4 个答案:

答案 0 :(得分:10)

您可以逐行构建4xW矩形。构建下一行时,上一行可以处于6种不同的状态:

XXXX (1 - filled)
XX-- (2)
-XX- (3)
--XX (4)
X--X (5)
---- (6 - empty)

例如,如果前一行是(5),则必须放置两个垂直多米诺骨牌,然后下一行将是(3):

XXXX
XABX
-AB-

X(W,q)表示4xW矩形的可能组合,其中最后一行处于状态q,其余部分完全填充。

如果您知道所有6个X(W-1,q)州的q,则可以轻松计算X(W,q)

您知道初始状态X(1,q)(q = 1..6 - > 1,1,1,1,1,无效)。所以你可以增加W并为每个W获得这些数字。

最终结果为X(W,1)(最后一行已填充)。

答案 1 :(得分:7)

我也是动态编程变体的初学者,但是此链接提到您需要应用“动态编程与配置文件”的http://apps.topcoder.com/forums/;jsessionid=A5053396424C9F9BBB9337ECAC9C6C17?module=Thread&threadID=770579&start=0&mc=2#1643035,并且该链接还指向教程http://apps.topcoder.com/forums/?module=Thread&threadID=697369&start=0&mc=19 ,“图层计数+图层配置文件”。

从以上链接: “这是最强类型的DP状态域。它通常用于特殊图形上的平铺或覆盖问题。经典的例子是:计算用多米诺骨牌平铺矩形板的方法的数量(某些单元格)不能使用);或者尽可能多地在国际象棋棋盘上放置国际象棋棋子,这样它们就不会相互碰撞(同样,一些细胞也可能受到限制)。“

有关此技术的更多平易近人的教程可在以下网址获得:

http://sk765.blogspot.in/2012/02/dynamic-programming-with-profile.html

http://sk765.blogspot.in/2012/02/dynamic-programming-with-profile_13.html

http://sk765.blogspot.in/2012/02/dynamic-programming-with-profile_7469.html

http://sk765.blogspot.in/2012/02/dynamic-programming-with-profile_6894.html

我也在努力解决这些问题。

这不是你提出的特定问题的答案,而是人们在解决这类问题时所遵循的一般技术。

答案 2 :(得分:0)

我会尝试一种回溯算法:首先水平放置所有的瓷砖,然后回溯直到你可以铺设一个垂直的瓷砖(然后用水平分层向前) - 最终你将枚举所有可能的解决方案,每个只有一次(一个正方形)最后的回溯阶段将包含水平或垂直图块,当存在时将提供唯一的解决方案。

我不知道,不过这是否是解决问题的最佳算法。

答案 3 :(得分:0)

如果通过移除任何2 * 1块,一个模式(gemoetry)出现,使得它再次成为中间结果,那么它就给出了递归函数。从那里只是从它创建DP。

对于您的问题,请参阅链接。它将解释一切

https://math.stackexchange.com/questions/664113/count-the-ways-to-fill-a-4-times-n-board-with-dominoes

有关进一步的参考资料,请参阅IOI培训的链接

http://www.iarcs.org.in/inoi/online-study-material/topics/dp-tiling.php