-문제: https://www.acmicpc.net/problem/11660
완전 탐색으로 하면 되는 쉬운 문제인 줄 알았는데, 시간 초과가 떴다.
그래서 찾아보니 dp로 (0,0)부터 (i,j)까지의 합을 저장한후 이를 이용하는 문제였다
이 풀이에서 가장 이해가 안가는 부분이다.
i+1,j+1까지의 합을 구하면 data[i][j]가 아니라 data[i+1][j+1]을 더해야 하는게 아닌가? 싶은 생각인데
실제 행렬 위치와 주어진 행렬 위치가 다르므로 그걸 생각해서 한 것같다. 이 부분은 좀 더 해봐야 할 것 같다
#(0,0)부터 (i,j)까지의 합이 dp[i+1][j+1]에 저장됨
dp[i+1][j+1]=dp[i][j+1]+dp[i+1][j]-dp[i][j]+data[i][j]
-정답풀이:
import sys
input=sys.stdin.readline
n,m=map(int,input().split())
data=[]
for _ in range(n):
data.append(list(map(int,input().split())))
dp=[[0]*(n+1) for _ in range(n+1)]
for i in range(n):
for j in range(n):
#(0,0)부터 (i,j)까지의 합이 dp[i+1][j+1]에 저장됨
dp[i+1][j+1]=dp[i][j+1]+dp[i+1][j]-dp[i][j]+data[i][j]
for _ in range(m):
a,b,c,d=map(int,input().split())
print(dp[c][d]-(dp[c][b-1]+dp[a-1][d]-dp[a-1][b-1]))
'백준 > DP' 카테고리의 다른 글
[dp/백준] 10942번: 팰린드롬? (0) | 2022.06.20 |
---|---|
[dp/백준] 1915번: 가장 큰 정사각형 (0) | 2022.06.19 |
[dp/백준] 9184번: 신나는 함수 실행 (0) | 2022.06.19 |
[dp/백준] 9252번: LCS2 (0) | 2022.06.18 |
[dp/백준] 1937번: 욕심많은 판다(다시 풀어보기) (0) | 2022.06.18 |