我真的不知道如何使用动态编程来做到这一点: 问题: 我需要找到一个表的2个最大的非重叠方块 例如:
5 6
R F F R R F
F F F F F F
R R F F F F
F F F F F F
F F F F F F
数字5和6分别是行数和列数,“R”表示保留 而“F”表示免费。在这种情况下,最大的正方形是
F F F F
F F F F
F F F F
F F F F
和第二大(与前一个不重叠)是
F F
F F
到目前为止,我已将值放入2D数组中,但不知道该怎么做。 试图引用0-1背包和LCS,但实际上我不知道应该把什么值放到我的桌子上。
答案 0 :(得分:0)
那么,设计动态编程算法时的首要任务应该是找到问题的递归解决方案。完成之后,将其转换为动态编程算法几乎是微不足道的;)。
一些可能/无法帮助的提示:
可能的基本情况很明显:任何两个1个单元格的方块总是不重叠。
请记住,两个正方形中最大的一个不能覆盖整个表格(因为那时你不会有第二个),所以它不能是行:列大小。
你应该对你评估的每个解决方案都有一个“得分”,看看哪个是最好的。这个得分显然是size1 + size2,条件是size1应该是最大的。
祝你好运!!答案 1 :(得分:0)
这是Longest Common Substring Problem而非LCS(最长公共子序列)的变体。将您要比较的两个字符串作为矩形的边,其字符为正方形。正方形中的“F”表示字符串中两个字符之间的匹配,因此最大的正方形是最长的公共子字符串。