์•Œ๊ณ ๋ฆฌ์ฆ˜/DP

[๋ฐฑ์ค€ 2169 ๐Ÿฅ‡] ๋กœ๋ด‡ ์กฐ์ข…ํ•˜๊ธฐ

1eehyunji 2023. 8. 20. 00:36

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๋ฅผ ๊ฐฑ์‹ ํ•ด๋‚˜๊ฐ€๋ฉด์„œ ์–ป๋Š”๋‹ค.