https://www.acmicpc.net/problem/2169
2169๋ฒ: ๋ก๋ด ์กฐ์ข ํ๊ธฐ
์ฒซ์งธ ์ค์ N, M(1≤N, M≤1,000)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ M๊ฐ์ ์๋ก ๋ฐฐ์ด์ด ์ฃผ์ด์ง๋ค. ๋ฐฐ์ด์ ๊ฐ ์๋ ์ ๋๊ฐ์ด 100์ ๋์ง ์๋ ์ ์์ด๋ค. ์ด ๊ฐ์ ๊ทธ ์ง์ญ์ ๊ฐ์น๋ฅผ ๋ํ๋ธ๋ค.
www.acmicpc.net
๋ฌธ์
NASA์์๋ ํ์ฑ ํ์ฌ๋ฅผ ์ํด ํ์ฑ์ ๋ฌด์ ์กฐ์ข ๋ก๋ด์ ๋ณด๋๋ค. ์ค์ ํ์ฑ์ ๋ชจ์ต์ ๊ต์ฅํ ๋ณต์กํ์ง๋ง, ๋ก๋ด์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ผ๋ง ์ ๋๊ธฐ ๋๋ฌธ์ ์งํ์ N×M ๋ฐฐ์ด๋ก ๋จ์ํ ํ์ฌ ์๊ฐํ๊ธฐ๋ก ํ๋ค.
์งํ์ ๊ณ ์ ์ฐจ์ ํน์ฑ์, ๋ก๋ด์ ์์ง์ผ ๋ ๋ฐฐ์ด์์ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ, ์๋์ชฝ์ผ๋ก ์ด๋ํ ์ ์์ง๋ง, ์์ชฝ์ผ๋ก๋ ์ด๋ํ ์ ์๋ค. ๋ํ ํ ๋ฒ ํ์ฌํ ์ง์ญ(๋ฐฐ์ด์์ ํ๋์ ์นธ)์ ํ์ฌํ์ง ์๊ธฐ๋ก ํ๋ค.
๊ฐ๊ฐ์ ์ง์ญ์ ํ์ฌ ๊ฐ์น๊ฐ ์๋๋ฐ, ๋ก๋ด์ ๋ฐฐ์ด์ ์ผ์ชฝ ์ (1, 1)์์ ์ถ๋ฐ์์ผ ์ค๋ฅธ์ชฝ ์๋ (N, M)์ผ๋ก ๋ณด๋ด๋ ค๊ณ ํ๋ค. ์ด๋, ์์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด์, ํ์ฌํ ์ง์ญ๋ค์ ๊ฐ์น์ ํฉ์ด ์ต๋๊ฐ ๋๋๋ก ํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N, M(1≤N, M≤1,000)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ M๊ฐ์ ์๋ก ๋ฐฐ์ด์ด ์ฃผ์ด์ง๋ค. ๋ฐฐ์ด์ ๊ฐ ์๋ ์ ๋๊ฐ์ด 100์ ๋์ง ์๋ ์ ์์ด๋ค. ์ด ๊ฐ์ ๊ทธ ์ง์ญ์ ๊ฐ์น๋ฅผ ๋ํ๋ธ๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ต๋ ๊ฐ์น์ ํฉ์ ์ถ๋ ฅํ๋ค.

๋ฌธ์ ํ์ด
import sys
from collections import deque
n,m=map(int, sys.stdin.readline().split(' '))
area=[list(map(int, sys.stdin.readline().strip().split(' '))) for _ in range(n)]
# ์ฒซ ๋ฒ์งธ ์์ ๋ถ๋ถ์์ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ์ค ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฐ์ ๊ฐ ์ ์์ผ๋ฏ๋ก, area๋ฅผ ์ผ->์ค ๋ฐฉํฅ์ผ๋ก ๋ณ๊ฒฝ
for i in range(1,m):
area[0][i]+=area[0][i-1]
dpLeft=[[0]*m for _ in range(n)]
dpRight=[[0]*m for _ in range(n)]
dpRight[0][0]=area[0][0]
dpLeft[0][0]=area[0][0]
for i in range(1, n):
# dpRight[i][0]์ ์์์ ๋ด๋ ค์ค๋ ํ ๊ฐ์ง ๊ฒฝ์ฐ๋ง ๊ฐ๋ฅ
dpRight[i][0] = area[i-1][0] + area[i][0]
# dpLeft[i][-1]์ ์์์ ๋ด๋ ค์ค๋ ํ ๊ฐ์ง ๊ฒฝ์ฐ๋ง ๊ฐ๋ฅ
dpLeft[i][-1] = area[i-1][-1] + area[i][-1]
# ์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ ๊ฒฝ์ฐ
for j in range(1,m):
# ์ผ์ชฝ์์ ์ค๋ ๋ฐฉํฅ์ ์๋์์ ๋ด๋ ค์ค๋ ๋ฐฉํฅ ์ค ์ด๋๊ฐ ๋ ํฐ์ง ํ์ธ
dpRight[i][j]=area[i][j]+max(area[i-1][j], dpRight[i][j-1])
# ์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ ๊ฒฝ์ฐ
for j in range(m-2,-1,-1):
# ์ค๋ฅธ์ชฝ์์ ์ค๋ ๋ฐฉํฅ๊ณผ ๋ด๋ ค์ค๋ ๋ฐฉํฅ ์ค ์ด๋๊ฐ ๋ ํฐ์ง ํ์ธ
dpLeft[i][j]=area[i][j]+max(area[i-1][j], dpLeft[i][j+1])
# dpLeft, dpRight ์ค ์ด๋ ๊ฐ์ด ๋ ํฐ์ง ๋น๊ต
for j in range(m):
area[i][j]=max(dpLeft[i][j], dpRight[i][j])
print(area[-1][-1])
- ์ฒ์์ ๋จ์ํ๊ฒ BFS ํ๋ฉด ๋๋ ๊ฑฐ ์๋๊ฐ? ์ถ์๋๋ฐ BFS๋ฅผ ์ด์ฉํด์ ์์ ํ์์ ๋๋ฆฌ๋ฉด ๊ฐ ๊ฒฝ๋ก๋ง๋ค visited ๋ฐฐ์ด์ ์ ์ธํด์ฃผ๋ค๋ณด๋ n,m์ ์ต๋ ํฌ๊ธฐ๊ฐ 1000์ด๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค.
- ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์๊ฐํด๋ณด๋ค๊ฐ DP๋ฅผ ๋ ์ฌ๋ฆฌ๊ฒ ๋์๋ค.
- DP[i][j]=num์ iํ j์ด๊น์ง ์ค๋๋ฐ ๊ฐ์ง ์ ์๋ ์ต๋๊ฐ์ด num์ด๋ผ๋ ๊ฒ์ ์๋ฏธํ๋ค.
- ์ผ์ชฝ, ์ค๋ฅธ์ชฝ, ์๋๋ก๋ง ์์ง์ผ ์ ์๊ณ , ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ง์ ์ ๋ค์ ๋ฐฉ๋ฌธํ ์ ์๊ธฐ ๋๋ฌธ์ ๋จผ์ ์ฒซ๋ฒ์งธ ํ์ ๋ฌด์กฐ๊ฑด ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ํฅํ๋ ๋ฐฉํฅ๋ง ๊ฐ๋ฅํ๋ค.

- ๊ทธ๋์ ๊ฐ ์ง์ ์ ๊ฐ์น๋ฅผ ์ ๋ ฅ๋ฐ์ area ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ํ์ ์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ ๋ฐ์ดํธํด์ค๋ค.
- ๋ค์์ด ์ด ๋ฌธ์ ์ ํต์ฌ ์์ด๋์ด๋ค!
- ์ด๋ค ์ง์ ์ ์ผ์ชฝ์์ ์ค๋ ๋ฐฉํฅ, ์ค๋ฅธ์ชฝ์์ ์ค๋ ๋ฐฉํฅ, ์์ชฝ์์ ์ค๋ ๋ฐฉํฅ์ผ๋ก ํด๋น ์์น์์์ ๊ฐ์น์ ํฉ์ ๊ณ์ฐํ ์ ์๋ค.
- ์ด ์ธ ๊ฐ์ง ๋ฐฉํฅ ์ค ๊ฐ์ฅ ํฐ ๊ฐ์ผ๋ก area ๋ฐฐ์ด์ ๊ฐฑ์ ํด์ค์ผ ํ๋ค.
- ๋จผ์ dpRight์๋ ์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ผ๋ก ์งํ๋๋ฏ๋ก, dpRight์ ์ ์ฅ๋ ์ผ์ชฝ์์ ์ค๋ ๊ฐ๊ณผ area์ ์ ์ฅ๋ ์์ชฝ์์ ์ค๋ ๊ฐ์ ๋น๊ตํด์ ๋ ํฐ ๊ฐ์ผ๋ก ๊ณ์ฐํด์ค๋ค.
- ์ผ์ชฝ์์ ์ค๋ ๊ฐ์ ํ์ฌ ํ์ dpRight๋ฅผ ๊ณ์ฐ ์ค์ ์ด์ ์ ๊ณ์ฐ๋ ๊ฐ dpRight[i][j-1]์ ์ฌ์ฉํ๊ณ , ์์ชฝ์์ ์ค๋ ๊ฐ์ ์ด๋ฏธ ์ด์ ํ์ ๊ณ์ฐํ๋ฉด์ ์ต๋๊ฐ์ผ๋ก ์ ์ฅ๋ ๊ฐ์ด๋ฏ๋ก area[i-1][j] ๊ฐ์ ์ฌ์ฉํ๋ค.
- dpRight์์ ๊ฐ ํ์ ์ฒซ ๋ฒ์งธ๋ ์ผ์ชฝ์์ ์ฌ ์ ์๋ ๊ฒฝ๋ก๊ฐ ์์ผ๋ฏ๋ก ์์ชฝ์์ ์ค๋ ๊ฐ๋ง ๊ฐ๋ฅํ๋ค.
- dpLeft๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก ์งํ๋๋ฏ๋ก, ์ค๋ฅธ์ชฝ์์ ์ค๋ ๊ฐ๊ณผ ์์ชฝ์์ ์ค๋ ๊ฐ์ ๋น๊ตํด์ ๋ ํฐ ๊ฐ์ผ๋ก ๊ณ์ฐํด์ค๋ค.
- ์ค๋ฅธ์ชฝ์์ ์ค๋ ๊ฐ์ ํ์ฌ ํ์ dpLeft๋ฅผ ๊ณ์ฐ ์ค์ ์ด์ ์ ๊ณ์ฐ๋ ๊ฐ dpLeft[i][j+1]์ ์ฌ์ฉํ๊ณ , ์์ชฝ์์ ์ค๋ ๊ฐ์ ์ด๋ฏธ ์ด์ ํ์ ๊ณ์ฐํ๋ฉด์ ์ต๋๊ฐ์ผ๋ก ์ ์ฅ๋ ๊ฐ์ด๋ฏ๋ก area[i-1][j] ๊ฐ์ ์ฌ์ฉํ๋ค.
- dpLeft์์ ๊ฐ ํ์ ๋ง์ง๋ง์ ์ค๋ฅธ์ชฝ์์ ์ฌ ์ ์๋ ๊ฒฝ๋ก๊ฐ ์์ผ๋ฏ๋ก ์ค๋ฅธ์ชฝ์์ ์ค๋ ๊ฐ๋ง ๊ฐ๋ฅํ๋ค.
- ๋ง์ง๋ง์ผ๋ก dpRight์ dpLeft๋ฅผ ๋น๊ตํด์ ์ด๋ ๋ฐฉํฅ์ผ๋ก ์งํํ๋ ์ชฝ์ด ๋ ํฐ ๊ฐ์ ๊ฐ์ง๋์ง ๋น๊ตํด์ area์ ์ ์ฅํด์ค๋ค.
- ์ด์ ๊ฐ์ด ํ ํ์ฉ ์ฐจ๋ก๋ก ๊ณ์ฐํด๋๊ฐ๋ฉด์ ๋ง์ง๋ง area[n-1][m-1]์ ์ ์ฅ๋๋ ๊ฐ์ด ๋ต์ด ๋๋ค.
- ์ด ๋ฌธ์ ์ ์์ 1์ ๊ธฐ์ค์ผ๋ก ๊ณ์ฐ ๊ณผ์ ์ 3๋ฒ์งธ ํ๊น์ง์ ๊ณ์ฐ ๊ณผ์ ์ ์ ๋ฆฌํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๊ฐ ์์น์์ ์ป์ ์ ์๋ ์ต๋ ๊ฐ์น๋ฅผ ํ ํ์ฉ area๋ฅผ ๊ฐฑ์ ํด๋๊ฐ๋ฉด์ ์ป๋๋ค.
'์๊ณ ๋ฆฌ์ฆ > DP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 1563 ๐ฅ] ๊ฐ๊ทผ์ (0) | 2023.08.24 |
---|---|
[๋ฐฑ์ค 1351 ๐ฅ] ๋ฌดํ ์์ด (0) | 2023.08.21 |
[๋ฐฑ์ค 3687 ๐ฅ] ์ฑ๋ฅ๊ฐ๋น (0) | 2023.08.18 |
[๋ฐฑ์ค 15989 ๐ฅ] 1, 2, 3 ๋ํ๊ธฐ 4 (0) | 2023.08.18 |
[๋ฐฑ์ค 1943 ๐ฅ] ๋์ ๋ถ๋ฐฐ (0) | 2023.08.16 |