728x90
SMALL

DP ๋ฌธ์ œ

https://www.acmicpc.net/problem/1149

 

๐Ÿ’ก ํ’€์ด ์ฝ”๋“œ (์„ฑ๊ณต)

import sys 
n = int(sys.stdin.readline())
graph = [[0] * 3 for _ in range(n + 1)]
dp = [[0] * 3 for _ in range(n + 1)]

for i in range(1, n + 1):
    graph[i][0], graph[i][1], graph[i][2] = map(int, sys.stdin.readline().split())    
    if i == 1:
        dp[i][0],dp[i][1],dp[i][2] = graph[i][0],graph[i][1],graph[i][2]

def sol(n, graph):

    for i in range(2, n + 1):
        for j in range(3):
            if dp[i][j - 1] != 0:
                # dp[i][j] = min(dp[i][j - 1],  dp[i - 1][j - 1] + graph[i][j], dp[i - 1][j - 2] + graph[i][j]) # ์ด ์ฝ”๋“œ์˜ ๋ฌธ์ œ์  -> ์ด์ „๊นŒ์ง€ ๋ˆ„์ ๋œ dp๊ฐ’์ด ํฌ๋ฉด ํ˜„์žฌ ์ƒ‰์ƒ์€ ์•„์˜ˆ ์•ˆ์น ํ•ด๋ฒ„๋ฆผ. ํ•˜์ง€๋งŒ, ๊ทธ ๋‹ค์Œ ์ž…๋ ฅ์„ ๊ณ ๋ คํ•  ๋•Œ ํ˜„์žฌ ์ƒ‰์ƒ์„ ์น ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋” ์œ ๋ฆฌํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Œ. ๋”ฐ๋ผ์„œ, ๋ฌด์กฐ๊ฑด ์ƒ‰์ƒ์„ ๋‹ค ์น ํ•œ ํ›„ ๋งˆ์ง€๋ง‰ํ–‰์—์„œ ์ตœ์†Ÿ๊ฐ’ ๋น„๊ต 
                dp[i][j] = min(dp[i - 1][j - 1] + graph[i][j], dp[i - 1][j - 2] + graph[i][j])
            else:
                dp[i][j] = min(dp[i - 1][j - 1] + graph[i][j], dp[i - 1][j - 2] + graph[i][j])

    print(min(dp[n])) 

sol(n, graph)

 

dp[i][j] = i๋ฒˆ์งธ ์ง‘์„ j๋ฒˆ์งธ ์ƒ‰์œผ๋กœ ์น ํ•  ๋•Œ์˜ ๋น„์šฉ์˜ ์ตœ์†Ÿ๊ฐ’ 

์ดˆ๊ธฐ ์ฝ”๋“œ ๋ฌธ์ œ์ 

์ดˆ๊ธฐ ์ฝ”๋“œ์—์„œ์˜ ์ ํ™”์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

dp[i][j] 

= min(dp[i][j - 1],  dp[i - 1][j - 1] + graph[i][j], dp[i - 1][j - 2] + graph[i][j])

= min(ํ˜„์žฌ ์ง‘์„ ์น ํ•  ๋•Œ j๋ฒˆ์งธ ์ƒ‰์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ์˜ ๋ˆ„์ ๋œ ์ตœ์†Œ ๋น„์šฉ,
์ด์ „ ์ง‘์„ j - 1๋ฒˆ์งธ ์ƒ‰๊น”๋กœ ์น ํ•  ๊ฒฝ์šฐ์˜ ๋ˆ„์ ๋œ ์ตœ์†Œ ๋น„์šฉ + ํ˜„์žฌ ์ง‘์„ j๋ฒˆ์งธ ์ƒ‰๊น”๋กœ ์น ํ•  ๊ฒฝ์šฐ์˜ ๋น„์šฉ,
์ด์ „ ์ง‘์„ j - 2๋ฒˆ์งธ ์ƒ‰๊น”๋กœ ์น ํ•  ๊ฒฝ์šฐ์˜ ๋ˆ„์ ๋œ ์ตœ์†Œ ๋น„์šฉ + ํ˜„์žฌ ์ง‘์„ j๋ฒˆ์งธ ์ƒ‰๊น”๋กœ ์น ํ•  ๊ฒฝ์šฐ์˜ ๋น„์šฉ)

 

-> ์ฆ‰, ํ˜„์žฌ ์ง‘์„ ์น ํ•  ๋•Œ j๋ฒˆ์งธ ์ƒ‰์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋น„์šฉ์ด ๋” ์ ๋‹ค๋ฉด ํ˜„์žฌ ์ง‘์„ ์น ํ•˜๋Š”๋ฐ j๋ฒˆ์งธ ์ƒ‰์ƒ์„ ์•„์˜ˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

ํ•˜์ง€๋งŒ, ๊ทธ ๋‹ค์Œ ์ž…๋ ฅ์„ ๊ณ ๋ คํ•  ๋•Œ ํ˜„์žฌ ์ง‘์„ j๋ฒˆ์งธ ์ƒ‰์ƒ์œผ๋กœ ์น ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋” ์œ ๋ฆฌํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ, dp[i][j]์—๋Š” ๋ฌด์กฐ๊ฑด j๋ฒˆ์งธ ์ƒ‰์œผ๋กœ ์ง‘์„ ์น ํ•  ๋•Œ์˜ ๋น„์šฉ์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ธฐ๋กํ•˜๊ณ , ๋งˆ์ง€๋ง‰ ํ–‰์—์„œ dp[n][0], dp[n][1], dp[n][2] ์‚ฌ์ด์˜ ์ตœ์†Ÿ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ๋‹ต์„ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

if dp[i][j - 1] != 0:
    dp[i][j] = min(dp[i][j - 1],  dp[i - 1][j - 1] + graph[i][j], dp[i - 1][j - 2] + graph[i][j]) # ์ฝ”๋“œ์˜ ๋ฌธ์ œ์ 

 

์ฃผ์š” ๋กœ์ง

dp[i][j]

= min(dp[i - 1][j - 1] + graph[i][j], dp[i - 1][j - 2] + graph[i][j])

= min(์ด์ „ ์ง‘์„ j - 1๋ฒˆ์งธ ์ƒ‰๊น”๋กœ ์น ํ•  ๊ฒฝ์šฐ์˜ ๋ˆ„์ ๋œ ์ตœ์†Œ ๋น„์šฉ + ํ˜„์žฌ ์ง‘์„ j๋ฒˆ์งธ ์ƒ‰๊น”๋กœ ์น ํ•  ๊ฒฝ์šฐ์˜ ๋น„์šฉ,
์ด์ „ ์ง‘์„ j - 2๋ฒˆ์งธ ์ƒ‰๊น”๋กœ ์น ํ•  ๊ฒฝ์šฐ์˜ ๋ˆ„์ ๋œ ์ตœ์†Œ ๋น„์šฉ + ํ˜„์žฌ ์ง‘์„ j๋ฒˆ์งธ ์ƒ‰๊น”๋กœ ์น ํ•  ๊ฒฝ์šฐ์˜ ๋น„์šฉ)

for i in range(2, n + 1):
    for j in range(3):
        dp[i][j] = min(dp[i - 1][j - 1] + graph[i][j], dp[i - 1][j - 2] + graph[i][j])

 

๋งˆ์ง€๋ง‰ ํ–‰์„ ๋นจ๊ฐ„์ƒ‰/์ดˆ๋ก์ƒ‰/ํŒŒ๋ž€์ƒ‰์œผ๋กœ ์น ํ•  ๊ฒฝ์šฐ์˜ ๋ˆ„์ ๋œ ์ตœ์†Œ ๋น„์šฉ์„ ๋น„๊ตํ•˜์—ฌ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

print(min(dp[n]))
728x90
LIST
_์€์„ _