ABOUT ME

https://github.com/chongin12 chongin12@naver.com

Today
Yesterday
Total
  • 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

    댓글

Designed by Tistory.