Algorithm dins最小矩形数的算法

Algorithm dins最小矩形数的算法,algorithm,coordinates,rectangles,Algorithm,Coordinates,Rectangles,我在坐标系中有一个矩形区域R和一组位于R内的点p。所有边都平行于轴,所有点都是整数。我想把R分成更小的矩形,这样 (a) 矩形的边要么粘在R的边上,要么至少包括一个从p到p的点 (b) 在每个矩形中,从p到p正好有一个点 我必须找到覆盖p中所有点的最小数量的矩形。这里画了一个例子:紫色线表示不正确的分割,因为上面的矩形不包括p中的点。然而,蓝色线很好,因为两个矩形都有一个p中的点,所以正确的输出应该是:2,因为这是最小数量的矩形 有没有人有找到最小数的算法/方法的想法?根据您的说明,我最终使用了

我在坐标系中有一个矩形区域R和一组位于R内的点p。所有边都平行于轴,所有点都是整数。我想把R分成更小的矩形,这样

(a) 矩形的边要么粘在R的边上,要么至少包括一个从p到p的点

(b) 在每个矩形中,从p到p正好有一个点

我必须找到覆盖p中所有点的最小数量的矩形。这里画了一个例子:紫色线表示不正确的分割,因为上面的矩形不包括p中的点。然而,蓝色线很好,因为两个矩形都有一个p中的点,所以正确的输出应该是:2,因为这是最小数量的矩形


有没有人有找到最小数的算法/方法的想法?

根据您的说明,我最终使用了这种递归算法:(伪代码~ ruby实现)

def解析R,P
如果P.empty?
归零
elsif P.size==1
返回1
结束
结果=[]
P.每个人都做| P|
rect1,rect2=垂直分裂(R,P,P)
s1=拆分解析(rect1,rect2)
rect1,rect2=水平分裂(R,P,P)
s2=拆分解析(rect1,rect2)
results.push[s1,s2].min
结束
返回results.min
结束
def拆分_解析rect1、rect2
sum1=解析(rect1.R,rect1.P)
sum2=解析(rect2.R,rect2.P)
如果!sum1.nil?还有!sum2.nil?
返回sum1+sum2
其他的
归零
结束
结束
函数
split_vertical
split_horizontal
使用一条垂直线和一条水平线通过点
p
分割区域
R

您还可以使用动态规划优化此算法。您可以存储子矩形的结果,而无需在其他时间进行计算。当几个点位于同一条线上时,就会发生这种情况


ps:不要复制原始源代码,你可能会遇到一些关于
nil
的问题。这只是整个过程中的一个伪代码示例。

我会浏览一个动态编程解决方案。有一件事我不清楚:如何创建这些矩形?(例如,
2x2
矩形是否有效?)。边和角上的点呢?允许吗?如果是的话,它们是否算作所有相邻的矩形,没有一个或其他的?重读问题后,我猜边和角上的点是允许的,有时甚至是必需的,但不算作在任何矩形内,对吗?丹尼尔,是的。每个矩形内必须只有一个点,但边/角上的这些点不计算在内。边上的点可以很多。例如,你可以在P中有12个点,但只形成2个矩形,因为其中10个在一条直线上,另外两个算在内。你们需要这些边上的点来创建等分线。你不能在任何你想要的地方跨越一条线:)这个算法是如何使用动态规划技术的?它将主要问题递归地分解为两个子问题。是的,的确如此,所以它递归地解决问题,而不是动态地解决问题。我可能在正确的术语上错了。如果我的子问题与原始问题不同,它将是动态的?是将动态规划应用于背包问题的一个很好的例子。