어떤 점 (x, y)에서 도달가능한 모든 지점들이 포함된 집합을 p(x, y)라 할게요.


일단 장애물이 없는 상황부터 생각해봅시다.


|p(x+1, y) - p(x+1, y+1)|는 (x,y)에서 꼭 오른쪽으로 진행해야만 도달할 수 있는 지점의 수입니다.

|p(x, y+1) - p(x+1, y+1)|는 아래쪽으로고요.

이 둘을 곱하면 독립쌍의 수가 됩니다.


x, y < N - 1인 모든 점에 대하여 독립쌍의 수를 구하고 합하면 정답입니다.


p(x,y)는 dp를 사용하면 구할 수 있습니다.

dp[x][y] = dp[x+1][y] + dp[x][y+1] - dp[x+1][y+1]을 하면 됩니다.

물론 dp배열은 오른쪽 아래부터 왼쪽 위로 순서대로 값을 계산해줘야합니다.


이제 장애물이 있는 상황을 생각해봅시다.

아래 그림을 보자면 u=(x,y)라 할 때 빨간색 빗금이 p(x,y+1), 파란색 빗금이 p(x+1,y)입니다.

u에서 시작하는 경로 중 독립쌍의 수를 세려면

저 빨간색과 파란색 빗금이 겹치는 지점의 수를 찾아서 빼줘야합니다. 

아까 장애물이 없었을 때의 p(x+1,y+1)을 빼줬던 것처럼 빼야하는데 u의 오른쪽 아래는 벽이 있어서 저렇게 겹치는 부분이 멀리 가있는 것입니다.


저 값을 u의 오른쪽 아래로 직접 운반해주면 됩니다.

dp배열을 순회할 때 현재 위치에 벽이 있을 때,

오른쪽과 아래쪽에 둘 다 벽이 없으면 k의 왼쪽 위 지점이라는 뜻입니다. |p(k)|의 값을 넣어줍니다.

그 외의 경우 오른쪽, 아래쪽, 대각선 지점 중 벽이 있는 곳을 찾아서 값을 복사해줍니다.


그럼 벽이 모여있는 뭉탱이가 다 같은 k값을 가지게 됩니다.

그래서 u에서도 독립쌍의 수를 계산할 때 (x+1,y+1)에 벽이 있더라도 dp[x][y] = dp[x+1][y] + dp[x][y+1] - dp[x+1][y+1]로 계산하면 됩니다.


되게 쉽게 푼 거 같고 풀이 공유하고 싶어서 공들여 썼습니다... 읽어주셔서 감사합니다.