我有一个整数高度和恒定宽度1的直方图.我想在直方图下最大化矩形区域.例如:
_
| |
| |_
| |
| |_
| |
Run Code Online (Sandbox Code Playgroud)
使用col1和col2,答案是6,3*2.
O(n ^ 2)蛮力对我来说很清楚,我想要一个O(n log n)算法.我试图按照最大增加子序列O(n log n)算法的方式来思考动态编程,但我没有继续前进.我应该使用分而治之的算法吗?
PS:如果没有这样的解决方案,请求具有足够声誉的人删除分而治之标签.
在mho评论之后:我的意思是完全适合的最大矩形区域.(感谢j_random_hacker澄清:)).
我有一个图像,这是一个小切口:

如你所见,它是黑色背景上的白色像素.我们可以在这些像素(或更好的点)之间绘制虚线.通过这些线,我们可以包围区域.
如何在此图像中找到不包含白色像素的最大凸黑区域?
这是一个小手绘的例子,我的意思是最大的凸黑区域:

PS:图像不是噪声,它代表水平排序的10000000以下的素数.
我需要在一个充满1和0的巨型文件中找到最大的1的平方.我知道我必须使用动态编程.我将它存储在2D数组中.任何有关找到最大方块的算法的帮助都会很棒,谢谢!
示例输入:
1 0 1 0 1 0
1 0 1 1 1 1
0 1 1 1 1 1
0 0 1 1 1 1
1 1 1 1 1 1
Run Code Online (Sandbox Code Playgroud)
回答:
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
Run Code Online (Sandbox Code Playgroud)
我的代码到目前为止:
int Square (Sq[int x][int y]) {
if (Sq[x][y]) == 0) {
return 0;
}
else {
return 1+MIN( Sq(X-1,Y), Sq(X,Y-1), Sq(X-1,Y-1) );
}
}
Run Code Online (Sandbox Code Playgroud)
(假设已经输入数组的值)
int main() {
int Sq[5][6]; …Run Code Online (Sandbox Code Playgroud) 所有,
我一直试图找出如何在一个座位内选择15张票.
编辑:问题是 - 如何找到给定尺寸的所有矩形(例如3x5)的免费座位?

下面是我的表,查询选择4个连续席位(或15或其他),这是好的...
但我想做的是选择说15个座位,这些可以分成多行,即3 x 5,但我希望它们被封锁在一起,即
row 9 ..(some seats)..[5 seats]..(some seats)..
row 8 ..(some seats)..[5 seats]..(some seats)..
row 7 ..(some seats)..[5 seats]..(some seats)..
Run Code Online (Sandbox Code Playgroud)
也就是说,他们将在彼此前面排成3排.row9座位10到25,row8座位10到25,row7座位10到25.
还可能需要考虑座椅块是否具有不同数量的座椅,即角块可以呈弧形以在后部具有比前部更多的座椅.
以ehnaceing SQL或某些算法或某些PHP代码的形式提供的任何指导.一周的大部分时间里,我一直在捣乱自己的大脑.
CREATE TABLE `seats` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`event_id` int(11) DEFAULT NULL,
`performance` int(11) DEFAULT NULL,
`block` int(11) DEFAULT NULL,
`row` int(11) DEFAULT NULL,
`seat` int(11) DEFAULT NULL,
`status` int(10) DEFAULT 1,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
我的查询到了 - 它返回X席的块组合.
SELECT a.event_id, a.performance, a.block, …Run Code Online (Sandbox Code Playgroud) 我在黑色背景上有一些图像,其中图像没有方形边缘(见下图右下方).我想把它们裁剪成最大的矩形图像(红色边框).我知道我可能会失去原始图像.是否可以在OpenCV中使用Python执行此操作.我知道有一些功能可以裁剪到轮廓的边界框,但这仍然会让我在地方留下黑色背景.

我正在尝试提出一种动态编程算法,该算法在矩阵中找到由相同数字组成的最大子矩阵:
例:
{5 5 8}
{5 5 7}
{3 4 1}
Run Code Online (Sandbox Code Playgroud)
答案:由于矩阵导致4个元素
5 5
5 5
Run Code Online (Sandbox Code Playgroud) 给定NxNxN二进制数组(仅包含0或1),我们如何获得具有非平凡解的最大长方体,即在O(N ^ 3)?
-
找到在N×N二进制矩阵中仅包含零但在上部维度中的最大矩形是同样的问题.此外,在我的情况下,最大的矩形可以"穿过阵列的边缘",即空间就像是2D矩阵的圆环.
对于2D数组,如果条目是:
00111
00111
11000
00000
00111
Run Code Online (Sandbox Code Playgroud)
'X'描述的解决方案是
00XXX
00XXX
11000
00000
00XXX
Run Code Online (Sandbox Code Playgroud)
我已经完成了NxN二进制数组的计算,并按照http://tech-queries.blogspot.de/2011/03/maximum-中的想法找到了O(N ^ 2)中最大矩形问题的解决方案.area-rectangle-in-histogram.html.但我不知道如何将它应用于3D阵列.
-
解决方案"越过边缘"的3x3x3阵列示例:
111
100
011
111
001
111
011
110
011
Run Code Online (Sandbox Code Playgroud)
解决方案应该是:
1XX
100
0XX
1XX
001
1XX
0XX
110
0XX
Run Code Online (Sandbox Code Playgroud) 我需要在c ++中编写递归函数,在2d数组中找到最大区域的数字'1',只包含1或0.
例:
int Arr[5][8] =
{
{ 0, 0, 0, 0, 1, 1, 0, 0, },
{ 1, 0, 0, 1, 1, 1, 0, 0, },
{ 1, 1, 0, 1, 0, 1, 1, 0, },
{ 0, 0, 0, 1, 1, 1, 1, 0, },
{ 0, 1, 1, 0, 0, 0, 0, 0, },
};
Run Code Online (Sandbox Code Playgroud)
可视化示例:http://s23.postimg.org/yabwp6h23/find_largest.png
该阵列的最大区域为12,第二大区域为3,第三大区域为2.
我想用洪水填充算法做类似的事情,但是无法弄清楚如何.
场景:有一个矩形空间,里面有任意放置的任意方向的多边形.目的是找到可以安装在矩形空间的空区域内的最大空矩形.下面的这些图像说明了多边形为蓝色的情景,虚线表示可以在每个方案中拟合的最大空矩形.
问题:显然,找到最大的空矩形是计算几何中众所周知的问题,但我在这个领域发现的算法涉及在点(CGAL实现了这一点)和线段中找到空矩形.有没有办法根据我的场景调整这些现有技术?或者有更简单的方法吗?
我正在尝试用Python 实现Dr. Dobbs的最大矩形算法(清单4).它主要起作用,但是一个特定情况会给出错误的结果,我无法弄清楚原因.
这是我的源代码:
from collections import namedtuple
Point = namedtuple('Point', ('X', 'Y'))
#Y 0 1 2 X
arr = [[0, 0, 0, ], #0
[1, 0, 0, ], #1
[0, 0, 1, ], #2
]
def area(ll, ur):
if (ll.X < 0) or (ll.Y < 0) or (ur.X < 0) or (ur.Y < 0):
return 0.
return ((ur.X - ll.X) + 1) * ((ur.Y - ll.Y) + 1)
def update_cache(a, c, x):
M = len(a[0])
N = …Run Code Online (Sandbox Code Playgroud)