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]))
'Algorithm > DP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 9095 : 1, 2, 3 ๋ํ๊ธฐ (ํ์ด์ฌ) (0) | 2024.08.23 |
---|---|
[๋ฐฑ์ค] 17404 : RGB ๊ฑฐ๋ฆฌ 2 (ํ์ด์ฌ) (0) | 2024.08.12 |
[๋ฐฑ์ค] 10986 : ๋๋จธ์ง ํฉ (ํ์ด์ฌ) (0) | 2024.08.08 |
[๋ฐฑ์ค] 2560 : ์ง์ ๋ฒ๋ (ํ์ด์ฌ) (0) | 2024.07.30 |
[๋ฐฑ์ค] 2616 : ์ํ๊ธฐ๊ด์ฐจ (ํ์ด์ฌ) (0) | 2024.07.29 |
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]))
'Algorithm > DP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 9095 : 1, 2, 3 ๋ํ๊ธฐ (ํ์ด์ฌ) (0) | 2024.08.23 |
---|---|
[๋ฐฑ์ค] 17404 : RGB ๊ฑฐ๋ฆฌ 2 (ํ์ด์ฌ) (0) | 2024.08.12 |
[๋ฐฑ์ค] 10986 : ๋๋จธ์ง ํฉ (ํ์ด์ฌ) (0) | 2024.08.08 |
[๋ฐฑ์ค] 2560 : ์ง์ ๋ฒ๋ (ํ์ด์ฌ) (0) | 2024.07.30 |
[๋ฐฑ์ค] 2616 : ์ํ๊ธฐ๊ด์ฐจ (ํ์ด์ฌ) (0) | 2024.07.29 |