高度更新的過程:
邊界的更新:
這種方法和常規的動態規劃有差別,沒有常規的dp矩陣定義。但是在行向下變化的時候,也是利用之前的狀態。
class solution(object):
def update(self,i,j,dp):
length = dp[i][j][0]
height = dp[i][j][1]
area = 0
for count in range(height):
length = min(dp[i-count][j][0],length)
area = max(area,length*(count+1))
return area
def maximalrectangle(self, matrix):
""":type matrix: list[list[str]]
:rtype: int
"""if not matrix:
return 0
res = 0
dp = [[[0,0,0]for _ in range(len(matrix[0]))]for _ in range(len(matrix))]
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j]=="0":
continue
else:
if i==0 and j==0:
dp[i][j]=[1,1,1]
res = max(res,dp[i][j][2])
elif i==0:
dp[i][j]=[dp[i][j-1][0]+1,1,dp[i][j-1][2]+1]
res = max(res,dp[i][j][2])
elif j==0:
dp[i][j]=[1,dp[i-1][j][1]+1,dp[i-1][j][2]+1]
res = max(res,dp[i][j][2])
else:
dp[i][j]=[dp[i][j-1][0]+1,dp[i-1][j][1]+1,0]
dp[i][j][2]=self.update(i,j,dp)
res = max(res,dp[i][j][2])
return res
dp的定義:[該點向左最大長度,該點向上最大高度,該點所能組成的矩形最大面積]
狀態轉移:根據之前的狀態,能夠知道當前點,向前最大的長度和向上最大的高度。但是不一定就是這個最大長度和高度就能組成最大矩形,因為這矩形裡面可能有"0"。所以要遍歷這個區域(最大長度和高度組成的矩形區域)找到最大矩形,儲存最大面積。
85 最大矩形
給定乙個僅包含 0 和 1 的二維二進位制矩陣,找出只包含 1 的最大矩形,並返回其面積。示例 輸入 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 輸出 6 方法 按層分割法 思路 按層生成從頭部開始,生成每一層的柱狀圖,然後求得改層的所能達到的最大面積,直到遍歷完...
85 最大矩形
給定乙個僅包含 0 和 1 的二維二進位制矩陣,找出只包含 1 的最大矩形,並返回其面積。示例 輸入 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 輸出 6 使用柱狀圖 棧 defmaximalrectangle matrix if not matrix retur...
85 最大矩形
題目 思路 這一題的演算法本質上和84題largest rectangle in histogram一樣,對每一行都求出每個元素對應的高度,這個高度就是對應的連續1的長度,然後對每一行都更新一次最大矩形面積。那麼這個問題就變成了largest rectangle in histogram。本質上是對...