python长方形代码_python – 最大矩形算法实现

这是我的源代码:

from collections import namedtuple

Point = namedtuple('Point',('X','Y'))

#Y 0 1 2 X

arr = [[0,],#0

[1,#1

[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 = len(a)

for y in range(M):

if a[x][y] == 0:

c[y] = c[y] + 1

else:

c[y] = 0

def mrp(a):

best_ll = Point(-1,-1)

best_ur = Point(-1,-1)

M = len(a[0])

N = len(a)

c = [0 for x in range(M + 1)]

stack = []

for x in range(N-1,-1,-1):

update_cache(a,x)

width = 0

for y in range(M + 1):

if c[y] > width:

stack.append((y,width))

width = c[y]

if c[y] < width:

while True:

y0,w0 = stack.pop()

if (width * (y - y0)) > area(best_ll,best_ur):

best_ll = Point(x,y0)

best_ur = Point(x + width - 1,y - 1)

width = w0

if (c[y] >= width):

break

width = c[y]

if width == 0:

stack.append((y0,width))

return best_ll,best_ur

这是结果:

>>> mrp(arr)

(Point(X=0,Y=0),Point(X=1,Y=2))

正如你所看到的,第一点是错误的,但我无法弄清楚它出错的地点和原因.更改arr会给出正确的结果.

编辑:我注意到与文章相比,我已经更改了数组的值.这会更改update_cache中的比较. 0 =清除,1 =保留.我正在寻找结果(Point(X = 0,Y = 1),Point(X = 1,Y = 2)).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值