[백준] 11660 구간 합 구하기5 python

hyewon9913·2024년 4월 24일

코딩테스트(python)

목록 보기
16/46

처음에는 범위를 제대로 안보고 이중 for문을 통해 구현 하였더니
당연히 시간초과가 발생했다.

어떻게 해야할지 방법을 찾다가 dp를 통해 문제를 해결하면 되겠다고 막연히 생각은 했으나 단순이 dp[x2][y2]-dp[x1][y1] 을 해보다가 좀 더 식을 상세하게 세워야지 문제를 해결 할 수 있다는 것을 깨달았다.

일단

for i in range(1,n+1):
    for j in range(1,n+1):
        #한칸씩 +1해서 dp 에 저장
        dp[i][j] = dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+graph[i-1][j-1]

이런식으로 하여 누적합을 표현하는 dp 그래프를 만들어 준 후

답은
ans = dp[x2][y2] - dp[x1-1][y2] - dp[x2][y1-1] + dp[x1-1][y1-1]

해당 점화식을 통해 구해주면 된다.

단순이 두 지점의 누적합을 빼주는 것이 아니라 빼줄 부분을 빼주고 중복으로 빼준 것은 다시 더해주고 하는 것을 생각하는 부분이 어려웠던 문제인 것같다.

앞으로는 이런 점화식을 좀 더 스스로 머리를 써서 세워야 할 것 같다.

n,m = map(int,input().split())



graph = []
for i in range(n):
    graph.append(list(map(int,input().split())))


dp = [[0]*(n+1) for _ in range(n+1)]

for i in range(1,n+1):
    for j in range(1,n+1):
        #한칸씩 +1해서 dp 에 저장
        dp[i][j] = dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+graph[i-1][j-1]

for i in range(m):
    x1,y1,x2,y2 = map(int,input().split())
    ans = dp[x2][y2] - dp[x1-1][y2] - dp[x2][y1-1] + dp[x1-1][y1-1]
    print(ans)
profile
차근차근 굴러가는 코딩일지

0개의 댓글