問題
D – おいしいたこ焼きの焼き方
解説を読んでも解けなかった…。
回答
参考
回答はpythonであるということ以外は上の写経です。
import sys
# input処理を高速化する
input = sys.stdin.readline
def main():
N = int(input())
D = [list(map(int, input().split())) for _ in range(N)]
Q = int(input())
P = [int(input()) for _ in range(Q)]
# S[i][j](0,0)〜(i,j)までのたこ焼きの美味しさの和
S = [[0] * (N+1) for _ in range(N+1)]
# たこ焼きの美味しさの累積和
for i in range(N):
for j in range(N):
S[i+1][j+1] = S[i][j+1] + S[i+1][j] - S[i][j] + D[i][j]
# value[s]面積sの長方形領域の総和の最大値
value = [0] * (N**2 + 1)
for x1 in range(N):
for x2 in range(x1 + 1, N+1):
for y1 in range(N):
for y2 in range(y1+1, N+1):
area = (x2 - x1) * (y2 - y1)
sum = S[x2][y2] - S[x1][y2] - S[x2][y1] + S[x1][y1]
value[area] = max(value[area], sum)
# dp_2[s]面積s以下の長方形領域の総和の最大値
for i in range((N)**2):
value[i+1] = max(value[i+1], value[i])
for p in P:
print(value[p])
main()
import sys
# input処理を高速化する
input = sys.stdin.readline
def main():
N = int(input())
D = [list(map(int, input().split())) for _ in range(N)]
Q = int(input())
P = [int(input()) for _ in range(Q)]
# S[i][j](0,0)〜(i,j)までのたこ焼きの美味しさの和
S = [[0] * (N+1) for _ in range(N+1)]
# たこ焼きの美味しさの累積和
for i in range(N):
for j in range(N):
S[i+1][j+1] = S[i][j+1] + S[i+1][j] - S[i][j] + D[i][j]
# value[s]面積sの長方形領域の総和の最大値
value = [0] * (N**2 + 1)
for x1 in range(N):
for x2 in range(x1 + 1, N+1):
for y1 in range(N):
for y2 in range(y1+1, N+1):
area = (x2 - x1) * (y2 - y1)
sum = S[x2][y2] - S[x1][y2] - S[x2][y1] + S[x1][y1]
value[area] = max(value[area], sum)
# dp_2[s]面積s以下の長方形領域の総和の最大値
for i in range((N)**2):
value[i+1] = max(value[i+1], value[i])
for p in P:
print(value[p])
main()
import sys # input処理を高速化する input = sys.stdin.readline def main(): N = int(input()) D = [list(map(int, input().split())) for _ in range(N)] Q = int(input()) P = [int(input()) for _ in range(Q)] # S[i][j](0,0)〜(i,j)までのたこ焼きの美味しさの和 S = [[0] * (N+1) for _ in range(N+1)] # たこ焼きの美味しさの累積和 for i in range(N): for j in range(N): S[i+1][j+1] = S[i][j+1] + S[i+1][j] - S[i][j] + D[i][j] # value[s]面積sの長方形領域の総和の最大値 value = [0] * (N**2 + 1) for x1 in range(N): for x2 in range(x1 + 1, N+1): for y1 in range(N): for y2 in range(y1+1, N+1): area = (x2 - x1) * (y2 - y1) sum = S[x2][y2] - S[x1][y2] - S[x2][y1] + S[x1][y1] value[area] = max(value[area], sum) # dp_2[s]面積s以下の長方形領域の総和の最大値 for i in range((N)**2): value[i+1] = max(value[i+1], value[i]) for p in P: print(value[p]) main()