#11660 ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ
import sys
N, M = map(int, sys.stdin.readline().split())
matrix = []
for _ in range(N):
row = list(map(int, sys.stdin.readline().split()))
matrix.append(row)
for _ in range(M):
x1, y1, x2, y2 = map(int, sys.stdin.readline().split())
total = 0
for row in range(x1-1, x2):
for col in range(y1-1, y2):
total += matrix[row][col]
print(total)
๊ทธ๋ ๊ทธ๋ด์ค ์์์ด ๋ง๋งํ๊ฒ ํฉ๊ฒฉ ์ค๋ฆฌ๊ฐ ์์ง. ์๊ฐ์ด๊ณผ
๊ทธ๋ฌ๋ฉด ์ด๋ป๊ฒ ํ์ด์ผํด?
DP ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ, ๋์ ํฉ์ ์ฌ์ฉํด์ผํ๋ค.
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ(DP)๋?
ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฌ์ฉํด์ ํจ์จ์ ์ผ๋ก ํธ๋ ๋ฐฉ๋ฒ
ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ์ชผ๊ฐ์ ํผ๋ค๋ผ๊ณ ์๊ฐํ๋ฉด ๋จ.
๋์ ํฉ์ด๋?
2์ฐจ์ ๋ฐฐ์ด (ํ๋ ฌ)์ ํน์ ๊ตฌ๊ฐ ํฉ์ ๋น ๋ฅด๊ฒ ๊ตฌํ๊ธฐ ์ํ ์ ์ฒ๋ฆฌ ๋ฐฉ์
์ดํด๊ฐ ์ ์๊ฐ์ ๊ทธ๋ฆผ์ผ๋ก ๊ทธ๋ ค์๋ค.
๋ด๊ฐ [0][0]๋ถํฐ [3][3]๊น์ง์ ํฉ S[3][3]์ ๊ตฌํ๊ณ ์ถ๋ค๋ฉด,
S[3][3] = a[3][3] + S[3][2] + S[2][3] - S[2][2]๋ฅผ ํ๋ฉด ๋๋๊ฒ์ด๋ค.
์ด๊ฒ์ ์์ผ๋ก ์ผ๋ฐํ ํด๋ณด๋ฉด,
S[i][i] = a[i][i] + S[i][i-1] + S[i-1][i] - S[i-1][i-1]์ด ๋๊ฒ ์ง.
์ด๊ฒ์ ์ ์ฉํด์ ํ๋ฉด๋๋ค.
total = matrix[x][y] + DP[x-1][y] + DP[x][y-1]- DP[x-1][y-1]
๊ทธ๋์ ๋๋ ์ฝ๋๋ฅผ ์ด๋ ๊ฒ ์งฐ๋ค.
์, ๊ทธ๋ผ ์ฌ๊ธฐ์ ๋๊ฐ์ ์ฌ๋์ ๋ ์๋ฌธ์ด ์๊ธธ๊ฒ์ด๋ค.
์๋ (0,0)๋ถํฐ ์์ํ๋ ์ฝ๋์์!!!!!
์ค๊ฐ์์ ๋ถํฐ ์์ํ๋๊ฑด ๋ค์ ๊ณ์ฐํด์ผํ๋๊ฑฐ ์๋?
๋ง๋ค.
์ ๋ ๊ฒ ์ค๊ฐ๋ถํฐ ์์ํ๋ ํฉ์ ๊ตฌํ๋ ค๋ฉด,
์ด๋ ๊ฒ ํฐ ์ฌ๊ฐํ์์ ๋นผ์ค์ผํ๋ค.
๊ทธ๋ฐ๋ฐ! ์ด๊ฒ๋ ์์ DP ์์ ์ฌ์ฉํ๋ฉด ๋๋ค๋์ ~!
(x1, y1)๋ถํฐ (x2, y2)๊น์ง ๊ตฌํ๋ค๊ณ ํ๋ฉด,
total = DP[x2][y2]- DP[x2][y1-1] - DP[x1-1][y2] + DP[x1-1][y1-1]
์ด๋ ๊ฒ ํด์ฃผ๋ฉด ๋๋ค!
๊ทธ๋ฌ๋ฉด ์ด๋ ๊ฒ ์ง๋ณธ ์ฝ๋๋?
import sys
N, M = map(int, sys.stdin.readline().split())
matrix = []
DP = [[0] * (N+1) for _ in range(N+1)]
for _ in range(N):
row = list(map(int, sys.stdin.readline().split()))
matrix.append(row)
for i in range(N+1):
for j in range(N+1):
DP[i][j] = matrix[i-1][j-1] + DP[i-1][j] + DP[i][j-1] - DP[i-1][j-1]
for _ in range(M):
x1, y1, x2, y2 = map(int, sys.stdin.readline().split())
total = DP[x2][y2] - DP[x1-1][y2]- DP[x2][y1-1] + DP[x1-1][y1-1]
print(total)