【问题标题】:a minimal partition of a rectangular array into rectangular subarrays of constant value矩形阵列的最小分割成常数值的矩形子阵列
【发布时间】:2021-07-06 18:28:26
【问题描述】:

让 A 是一个 MxN 矩阵,其中条目 a_ij 在 {0, ..., n-1} 中。

我们可以把 A 中的条目想象成一个被 n 着色的矩形网格。

我有兴趣将每个彩色区域划分为矩形,这样可以最大限度地减少矩形的数量。也就是我要产生n组四元组

L_k = {(i, j, w, h) | a_xy = k forall i

满足每个a_ij 恰好属于一个矩形且所有矩形都不相交的条件。此外,总和 L_0 + ... + L_(n-1) 被最小化。

显然,最小化每个 L_k 可以独立完成,但也要求这发生得非常快。假设这是一个实时应用程序。可能的情况是,由于集合是不相交的,在 L_ks 之间共享信息比并行执行所有事情更快。 n 可以很小(例如,

我假设有一种动态编程方法来解决这个问题,或者也许有一种方法可以将其重新表述为一个图形问题,但对我来说如何解决这个问题并不是很明显。

编辑:

我的意思似乎有些混乱。这是一张帮助说明的图片。

想象这是一个 10x10 矩阵,红色 = 0,绿色 = 1,蓝色 = 2。像这样绘制黑框,尽量减少框的数量。这里的输出是

L_0 = {(0,8,2,2),(1,7,2,1),(2,8,1,1),(4,5,4,2),(6,7 ,2,2)}

L_1 = {(0,0,4,4),(4,0,6,2),(6,2,2,3),(8,8,2,2)}

L_2 = {(0,4,4,3),(0,7,1,1),(2,9,6,1),(3,7,3,2),(4,2 ,2,4),(8,2,2,6)}

【问题讨论】:

  • 关于“我想产生 n 组对”:你的意思是四组组吗?
  • Re“总和 L_0 + ... + L_(n-1)”:L_i 是四元组的集合。他们的总和是什么意思?您是指 tje 集的基数(元素数)之和吗?
  • 是的,感谢您的关注。
  • 如果我理解了这个问题,每个彩色区域都是独立的,并且任务减少到找到每个区域的最小矩形分区数。
  • thisthis 能解决您在单个区域的问题吗?

标签: arrays c algorithm partition


【解决方案1】:

立即要做的一件事是注意,您可以将问题分解为颜色连接区域的各个实例。从那里,文章中链接的帖子解释了如何使用最大匹配来构建最佳解决方案。

但这可能很难实现(根据您的 C 标签判断,更难)。所以我推荐以下两种策略之一:回溯或贪婪。

要进行回溯,您将对尚未覆盖的图块集进行递归(我认为这是有道理的,因为您已经列出了所有整数坐标。这会发生变化,但不会大量改变)。取最高的、最左边的未覆盖的瓷砖,并遍历所有可能包含它的矩形(其中只有 ~n^2 个,希望更少)。然后递归。

为了优化这一点,您需要进行修剪。如果您已经看到了具有更好答案的解决方案,则一种简单的修剪方法是停止递归。这种修剪称为分支定界。

如果您只需要一个大概的答案,您也可以在回溯的早期退出。既然您提到了“实时应用程序”,那您稍微偏离一下就可以了。

继续近似的想法,你也可以通过贪婪地选择你现在可以做的最大的矩形来做类似的事情。这实施起来很烦人,但可行。您还可以将此与递归结合起来并提前退出。

【讨论】:

    猜你喜欢
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 2023-02-24
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多