a026. APIO2009 1.采油区域 === 先了解用前綴和 算中間任意k*k塊的總和 https://blog.csdn.net/weixin_44176696/article/details/104988020 算出三塊不同位置的組合有6種 寫了兩個多小時 29行的迴圈圖片前面4種方案看不董代碼! [image](https://hackmd.io/_uploads/BkazY5khp.png) ```python= def kksum(x1, y1, x2, y2, z): return z[x2][y2] - z[x1 - 1][y2] - z[x2][y1 - 1] + z[x1 - 1][y1 - 1] m, n, k = map(int, input().split()) a = [[0] * (n + 1) for _ in range(m + 1)] ul = [[0] * (n + 1) for _ in range(m + 1)] ur = [[0] * (n + 1) for _ in range(m + 1)] dl = [[0] * (n + 1) for _ in range(m + 1)] dr = [[0] * (n + 1) for _ in range(m + 1)] for i in range(1, m + 1):#行的前綴和 row = list(map(int, input().split())) for j in range(1, n + 1):#列的前綴和 a[i][j] = row[j - 1] + a[i][j - 1] for i in range(1, m + 1): for j in range(1, n + 1): a[i][j] += a[i - 1][j] for i in range(k, m + 1):#ul for j in range(k, n + 1): ul[i][j] = max(kksum(i - k + 1, j - k + 1, i, j, a), ul[i - 1][j], ul[i][j - 1]) for i in range(k, m + 1):#ur for j in range(n - k + 1, 0, -1): ur[i][j] = max(kksum(i - k + 1, j, i, j + k - 1, a), ur[i - 1][j], ur[i][j + 1]) for i in range(m - k + 1, 0, -1):#dl for j in range(k, n + 1): dl[i][j] = max(kksum(i, j - k + 1, i + k - 1, j, a), dl[i + 1][j], dl[i][j - 1]) for i in range(m - k + 1, 0, -1):#dr for j in range(n - k + 1, 0, -1): dr[i][j] = max(kksum(i, j, i + k - 1, j + k - 1, a), dr[i + 1][j], dr[i][j + 1]) ans = 0 for i in range(k, m - k): up = ul[i][n]#上面那塊 dw = dl[i + k][n]#下面那塊 mid = 0 for j in range(k, n + 1): mid = max(mid, kksum(i + 1, j - k + 1, i + k, j, a)) #中間最大那塊 ans = max(ans, up + dw + mid) for j in range(k, n - k): le = max(ul[k][j], dl[k + 1][j])#左邊最大塊 ri = max(ur[k][j + k], dr[k + 1][j + k])#右邊最大塊 mid = 0 for i in range(k, m + 1): mid = max(mid, kksum(i - k + 1, j + 1, i, j + k, a)) #中間最大那塊 ans = max(ans, le + ri + mid) print(ans) ```