1. 問題描述:
2. 思路分析:
① 一開始的時候對於也想到了應該會是動態規劃的思路來解決,但是沒有想到具體的解決方案,動態規劃的難點一般也是在這裡,在官方的題解中提供的思路是使用乙個二維的list列表來記錄中間的結果,dp[i][j]表示以當前的i,j位置的正方形的個數,能夠想到這個思路也是非常巧妙的,當是第一行或者是第一列的時候那麼dp[i][j]就等於原矩陣的值,當矩陣的值為0的時候那麼dp列表的這個位置也是為0,為1的為當前位置的左邊、上邊與左上角的dp陣列的最小值再加上1即可
② 對於這種使用動態規劃思路來解決的問題,需要多練習與所思考才有思路
3. **如下:
class solution:
# 這個計算正方形的子矩陣動態規劃的方法的思路是非常值得借鑑的
def countsquares(self, matrix: list[list[int]]) -> int:
r, c = len(matrix), len(matrix[0])
# 初始化二維列表元素為0
dp = [[0] * c for _ in range(r)]
res = 0
for i in range(r):
for j in range(c):
if i == 0 or j == 0:
dp[i][j] = matrix[i][j]
elif matrix[i][j] == 0:
dp[i][j] = 0
else:
dp[i][j] = min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1
res += dp[i][j]
print(dp[i][j], end=" ")
return res
leetcode 統計全為 的正方形子矩陣
給你乙個 m n 的矩陣,矩陣中的元素不是 0 就是 1,請你統計並返回其中完全由 1 組成的 正方形 子矩陣的個數。示例 1 輸入 matrix 0,1,1,1 1,1,1,1 0,1,1,1 輸出 15 解釋 邊長為 1 的正方形有 10 個。邊長為 2 的正方形有 4 個。邊長為 3 的正方形...
dp 最大全1子正方形
例題1 usaco big barn 巨大的牛棚農夫約翰想要在他的正方形農場上建造一座正方形大牛棚。他討厭在他的農場中砍樹,想找乙個能夠讓他在空曠無樹的地方修建牛棚的地方。我們假定,他的農場劃分成 n x n 的方格。輸入資料中包括有樹的方格的列表。你的任務是計算並輸出,在他的農場中,不需要砍樹卻能...
二維陣列4 求全為1正方形221 1277
在乙個二維矩陣中找到最大的全是1的正方形,這個題若dp i j 表示以這個點為右下角的正方形的邊長,則它的平方就是這個正方形的面積 它的值可以由上下左上角上個點的最小值得到,因為他們三個都是1才能保證這個值也可以加進來。class solution else if matrix i j 0 0 el...