-
2167번 : 2차원 배열의 합알고리즘/백준(acmicpc.net) 문제풀이 2018. 6. 6. 15:47반응형
부분사각형을 구하는 문제다. 이 문제의 핵심은 "사각형을 어떻게 만들 것인가"이다.
위 사각형을 보자. 왼쪽 아래 꼭지점이 원점이라고 할 때, 1번 사각형의 넓이는 어떻게 나타낼 수 있을까?
그렇다. (전체 사각형의 넓이)에서 (2번사각형+4번사각형)을 빼고 (3번사각형 + 4번사각형)을 뺀 다음 (4번사각형)을 더해주면 된다.
왜 이런 방법을 쓸까?
그 이유는 넓이를 표현하기가 쉬워서 그렇다.
이 그림을 보면 ((0,0)은 4번사각형의 왼쪽 아래 꼭짓점을 나타냄)
1) (전체 사각형의 넓이)는 (0,0) 에서 (x,y)까지의 넓이2) (2번사각형 + 4번사각형)은 (0,0)에서 (i, y)까지의 넓이
3) (3번사각형 + 4번사각형)은 (0,0)에서 (x, j)까지의 넓이
4) (4번사각형)은 (0.0) 에서 (i, j)까지의 넓이
가 된다.
이를 dp로 저장할 때는
1) (전체 사각형의 넓이)는 dp[x][y]
2) (2번사각형 + 4번사각형)은 dp[i][y]
3) (3번사각형 + 4번사각형)은 dp[x][j]
4) (4번사각형)은 dp[i][j]
이렇게 쉽게 지정할 수 있다.
dp[i][j]는 위의 방법을 응용해서 dp[i-1][j] + dp[i][j-1] -dp[i-1][j-1] + arr[i][j]로 정의할 수 있다.
그렇다면 1번 사각형은 dp[x][y] - dp[x][j - 1] - dp[i - 1][y] + dp[i - 1][j - 1] 로 정의가 가능하다.
반응형'알고리즘 > 백준(acmicpc.net) 문제풀이' 카테고리의 다른 글
11048번 : 이동하기 (0) 2018.06.08 2294번 : 동전2 (0) 2018.06.07 9465번 : 스티커 (0) 2018.06.06 2163번 : 초콜릿 자르기 (0) 2018.06.05 1010번 : 다리 놓기 (0) 2018.06.05