๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป ์ฝ”๋”ฉํ…Œ์ŠคํŠธ/๋ฐฑ์ค€

[๋ฐฑ์ค€/python] 11660 ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ 5 - DP ๋ˆ„์ ํ•ฉ ์‚ฌ์šฉํ•˜๊ธฐ (๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ)

by ๋ฝ€์งœ๊ผฌ 2025. 5. 1.
728x90
๋ฐ˜์‘ํ˜•
#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)

 

728x90
๋ฐ˜์‘ํ˜•