|
|
1
9
本文: http://www.win.tue.nl/~gwoegi/papers/area-k-gons.pdf Eppstein等人提出了一种算法来解决最小周长和其他权重函数(如面积、内角总和等)的问题,这些函数遵循一定的约束条件,尽管标题中说的是最小面积(周长见推论5.3)。
设S是给定的点集,Q是k点的最小周长凸包。
我们可以将Q分解为一个三角形p1p2p3和一个k-1点Q'(与三角形p1p2p3共用边p1p3)的凸壳。
因此,为每四个(pi,pj,pk,m)保持最佳多边形的4d阵列,使得
可以帮助我们找到m=k的最佳多边形,给定m<=k-1。
希望有帮助。 |
|
|
2
2
这可不是什么好办法。事实上,这是一个相当痛苦的实现,但它肯定会给多项式的复杂性。虽然复杂性也很大(我粗略估计是n5*k),但有人可能会找到改进的方法,或者在这里找到更好的解决方案。或者对你来说已经足够了:即使是这种复杂性也比暴力强得多。
注意
:最优解(集
:集合中没有两个点形成垂直线。它可以很容易地实现旋转的一些无理角度周围的坐标原点整组点。
. 对于每一组点{p0,p1,p2,p3}和数字
我们从右到左遍历所有点。对于每个新点
注意
算法结束了:)此外,尽管复杂程度令人恐惧,但您可能会注意到,并非所有的段[p0,p1],[p2,p3]都可以
更新 这只提供了最佳的周长大小,而不是集合本身。但找到集合很简单:对于上面的每个“状态”,不仅要存储周长大小,还要存储最后添加的点。然后,你可以“追踪”你的解决方案。这是很标准的技巧,我想这对你来说不是问题,你似乎擅长算法:) 这本质上是DP(动态规划),只是有点臃肿 |
|
3
1
一个可能的优化:您可以忽略其凸包包含不在子集中的点的任何子集。 证明:
|
|
|
4
-2
据我所知,凸包对于每一组点都是唯一的,所以不需要求最小值。你只要找到一个,它将是最小的一个定义。 编辑 该方法求解的凸壳具有最少的点数。任何拥有更多点的船体都会有更长的周长,我把这个问题误解为寻找一个最小周长,而不是一个拥有K点的集合的最小周长。
|
|
|
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 1 年前 |
|
|
Alisa Petrova · 在有向图中更改一对顶点以创建循环 1 年前 |
|
|
b39b332d · 使用C++标准库实现高效间隔存储 2 年前 |
|
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 2 年前 |
|
|
EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 2 年前 |