给定一个4行棋盘和n
列。在每个单元格中都有一个整数。鉴于2n
光盘,其中的一部分,或者他们都可以放在板上的不同单元,所以总和是最大的。唯一的限制是2个碟片不能相互垂直或水平相邻。如何使用DP在O(n)
上将最佳光盘组合放置在电路板上?矩阵中的子和元素的动态编程
回答
1,我们不可能使用多于2 * n的磁盘,因为任何列最多可以包含2个磁盘。
比方说,d [i] [掩码] - 用磁盘填充从1到i的列后获得的最大数量,以便最后一列填充为掩码(掩码可以是0000,0001,0010,0100,0101,1000 ,1001或1010,其中1表示磁盘被放置,0表示它不是)
因此,d [i] [mask1] =(d [i-1] [mask2]的最大值+第2列),其中掩码2可以是与掩码1不抵触的任何掩码1
编辑1:您不需要更改任何内容。当你在某个面具上的第i步时,它仅取决于i-1的面具的答案。而你已经拥有了所有这些。你只是尝试从当前有效的d [i] [mask]中更新。正如我已经说过的那样d [i] [mask] - 存储可以从1到i填充列的最大值,最佳地使最后一列具有此掩码形式的磁盘(在我之前没有掩码因为它们不会影响下一列)
假设在第i列应用mask1得到的数字非常大,而mask1与mask2矛盾,我在哪里检查如何改变子问题中的所有内容,以便我可以在d [i] [mask1 ]? – itorra
@itorra更新了我的答案。也许如果你有一个例子,我可以解释一下 – Herokiller
- 1. 动态编程和矩阵的使用
- 2. 矩阵与元素的矩阵元素
- 3. 如何在矩阵中找到子矩阵的中间元素
- 4. 来自矩阵的所有2x2子矩阵中的每个元素的总和
- 5. C编程:如何在2x2矩阵中左右移动元素?
- 6. OpenCV中矩阵元素的总和?
- 7. 在矩阵元素移动
- 8. 矩阵链mutiplication动态编程
- 9. 矩阵的矩阵对角元素
- 10. 矩阵元素
- 11. 根据子矩阵规则更改大矩阵的元素
- 12. 总和的CSR矩阵的元素
- 13. 如何计算矩阵中元素子集的总和?
- 14. 向下移动矩阵的元素java
- 15. 带滑动窗口元素的矩阵
- 16. PHP中的动态矩阵
- 17. Python中的动态矩阵
- 18. 矩阵和向量的元素乘积
- 19. 矩阵幂的元素之和
- 20. R:从另一个矩阵的元素中减去矩阵的元素
- 21. R编程中的矩阵
- 22. 矩阵的元素structers
- 23. 修改矩阵的元素
- 24. 打印出动态数组或矩阵的元素
- 25. 比较相应的块矩阵元素中的另一矩阵
- 26. 矩阵和排列的子矩阵
- 27. 联合矩阵的元素中的R
- 28. 用平方置换子矩阵替换基矩阵中的元素
- 29. 选择矩阵元素(矩阵语言)
- 30. 用矩阵替换矩阵元素
所以我已经说过,每列有7种可能性模式(不放置光盘不是一个选项导致问题说部分)。我创建了一个矩阵M,如果我可以在列i + 1旁边放置一个列为c(可以是0到6)的列,将输出T或F.所以我想安排n个优先级队列大小为7,队列中的每个元素都是一对分类和来自该分类的数字的总和,在这里我卡住了 – itorra
为什么要使用优先级队列?试着想想你会如何将其作为一个DP来制定。您希望找到描述如何构建解决方案的重现。从简单开始:如果对我们可以在哪里放置光盘的位置没有限制,您将如何制定DP? –
所以我想到sum(n)= sum(n-1)+ max {pik:k从0到可能模式的数量}。 (p - 当前列)问题是每当我需要插入条件时我不能回头改变整个子问题 – itorra