あくまで備忘録なんで雑に記録します
まずAリストと、Sリスト初期化
Sリストの個数はN+1(Sリストの0行と0列は、全部0)
A = [[1, 7, 0, 6], [5, 8, 1, 11], [10, 4, 2, 201], [3, 16, 0, 1]]#4*4リスト
S = [[0]*5 for i in range(5)]#累積リストは+1の、5*5リストでの初期化
Sリスト作成
N × N 回まわす
Aは0〜N
Sは1〜N+1
for i in range(4):
for j in range(4):
S[i + 1][j + 1] += S[i + 1][j] + S[i][j + 1] - S[i][j] + A[i][j]
完成したSリストを使う
一次元累積和の書き方の復習①A[1]〜A[2]を②[A[1],A[3])と書いて、③S[3]-S[1]
ところが2次元なので、
赤部分 ー 橙部分 ー 橙部分 だと引きすぎ(青部分)なので、
赤 ー 橙 ー 橙 + 青
38 ー 8 ー 16 + 1 = 15
ans = S[3][3] - S[3][1] - S[1][3] + S[1][1]
print(ans)#15
コメント