๋ฐ์ํ
๐ฑ ๋ฌธ์
ํด์ฌ์ผ๊ณผ ๊ฐ ์ผ๋ง๋ค ์๋ด์ ์์๋๋ ์ผ์์ ๋ฐ์ ์ ์๋ ๊ธ์ก์ด ์ฃผ์ด์ง ๋, ์ป์ ์ ์๋ ์ต๋ ์ด์ต์ ์ถ๋ ฅํ๋ ๋ฌธ์ ์ ๋๋ค.
๋ฐฑ์ค 14501 ํด์ฌ ๋ฌธ์ ์ ๊ฐ์ ๋ฌธ์ ์ธ๋ฐ, ์๊ฐ๋ณต์ก๋๋ฅผ ์ค์ฌ์ ์ ์ถํด์ผ ๋ง์ถ ์ ์์ต๋๋ค.
๐ฑ ํ์ด 1 - ์๊ฐ ์ด๊ณผ
dp = [0 for _ in range(n + 1)]
for i in range(n):
for j in range(i + meetings[i][0], n + 1): # i์ผ ์๋ด ์งํํ์ ๋ ์๋ด ๊ฐ๋ฅํ ๋ ๋ถํฐ ๋๊ธฐ
dp[j] = max(dp[j], dp[i] + meetings[i][1])
print(dp[-1])
dp[i]
์๋i
์ผ๊น์ง ์ผํ์ ๋์ ์ต๋ ์์ต์ด ๋ด๊น๋๋ค.- ์ด ํ์ด์์๋
dp
๋ฐฐ์ด์ ์๋ฒฝํ๊ฒ ์ฑ์๋๋ค. ์ฆ, 1์ผ๋ถํฐ n์ผ๊น์ง ์ป์ ์ ์๋ ์ต๋ ์์ต์ ๋ชจ๋ ๊ตฌํฉ๋๋ค. - 2์ค for๋ฌธ์ ์ฌ์ฉํ์ฌ i์ผ์ ์์ํ ์๋ด์ด ๋๋๋ ๋ ๋ถํฐ ํด์ฌ์ผ๊น์ง ๋๊น์ง ์ํํฉ๋๋ค.
- ๋ฐ๋ผ์ ๊ฐ์ฅ ๋ง์ง๋ง๋ ์ ๋ฐ๋ก ์ถ๋ ฅํ๋ฉด ํด์ฌ์ผ(
n
์ผ)์ ์ต๋ ์์ต์ ์ถ๋ ฅํ ์ ์์ต๋๋ค. - ํ์ง๋ง ์ด๋ ๊ฒ 2์ค for๋ฌธ์ ๋๊ฒ ๋๋ฉด 15486๋ฒ์์๋ ์๊ฐ ์ด๊ฐ๊ฐ ๋ฉ๋๋ค.
๐ฑ ํ์ด 2
n = int(input())
dp = [0] * (n + 1)
meetings = [list(map(int, input().split())) for _ in range(n)]
meetings.insert(0, [0, 0])
# DP ํ์ด
profit = 0
for i in range(1, n + 1):
end_date = i + meetings[i][0] - 1 # i์ผ์ ์์ํ ์๋ด์ด ๋๋๋ ๋
profit = max(profit, dp[i - 1]) # i์ผ๊น์ง์ ์ต๋ ์์ต
if end_date <= n: # ์๋ด์ด ๋๋๋ ๋ ์ด ํด์ฌ์ผ์ ๋์ง ์์ผ๋ฉด
# ์ ํ์ (ํ์ฌ ์ ์ฅ๋ ์ต๋ ์์ต๊ณผ i-1์ผ๊น์ง์ ์ต๋ ์์ต + i์ผ ์๋ด ์์ต์ ๋น๊ต)
dp[end_date] = max(dp[end_date], profit+meetings[i][1])
print(max(dp))
- ํ์ด1๊ณผ๋ ๋ค๋ฅด๊ฒ
i
์ผ์ ์์ํ ์๋ด์ด ๋๋๋ ๋ ์dp
๋ง ์ ๋ฐ์ดํธ๋ฅผ ํฉ๋๋ค. (ํ์ด1์์๋ ์๋ด์ด ๋๋๋ ๋ ๋ถํฐ ํด์ฌ์ผ๊น์ง ๋๊น์ง ์ํํ๋๋ก for๋ฌธ์ ํ ๋ฒ ๋ ์ฌ์ฉํจ) - ๋์ ,
i-1
๊น์ง์ ์ต๋ ์์ต์ ๋ด๊ณ ์๋profit
๋ณ์๋ฅผ ์ฌ์ฉํ์ฌi-1
์ผ๊น์ง์ ์ต๋ ์์ต์i
์ผ ์๋ด ์์ต์ ๋ํ์ฌ i์ผ์ ์์ํ ์๋ด์ด ๋๋๋ ๋ ์ ์ต๋ ์์ต์ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค. - ๋ฐ๋ผ์
dp[end_date]
์ ๊ฐ์ ์ด๋ฏธ ์ ์ฅ๋์ด์๋dp[end_date]
์profit
(i-1์ผ๊น์ง์ ์ต๋ ์์ต)+meetings[i][1]
(i์ผ์ ์๋ด ์์ต)์ ๋น๊ตํ์ฌ ๋ ํฐ ๊ฐ์ผ๋ก ๊ฐฑ์ ํฉ๋๋ค. - ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์๋
dp[n]
์ด ์๋max(dp)
๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ์๋ํ๋ฉด for๋ฌธ์ ํ๋ฒ๋ง ์ฌ์ฉํ์ฌ i์ผ์ ์์ํ ์๋ด์ด ๋๋๋ ๋ ์dp
๊ฐ๋ง ์ ๋ฐ์ดํธ๋๊ธฐ ๋๋ฌธ์ ๋ง์ฝ, ๋ง์ง๋ง ๋ ์ ๋๋๋ ์๋ด์ด ์๋ค๋ฉดdp
๊ฐ์ด ๊ฐฑ์ ๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์dp
๋ฐฐ์ด์ ์ต๋๊ฐ์ printํ์ฌ ์ต๋ ์์ต์ ์ถ๋ ฅํ๋๋ก ํฉ๋๋ค.
๐ฑ ์ ๋ต ์ฝ๋
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# boj 15486 ํด์ฌ2
import sys
input = sys.stdin.readline
n = int(input())
dp = [0] * (n + 1)
meetings = [list(map(int, input().split())) for _ in range(n)]
meetings.insert(0, [0, 0])
# DP ํ์ด
profit = 0
for i in range(1, n + 1):
end_date = i + meetings[i][0] - 1
profit = max(profit, dp[i - 1])
if end_date <= n:
dp[end_date] = max(dp[end_date], profit+meetings[i][1])
print(max(dp))
๋ฐ์ํ
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] #4179 ๋ถ! (Python, BFS) (1) | 2023.10.14 |
---|---|
[BOJ] #2758 ๋ก๋ (Python, Dynamic Programming) (1) | 2023.10.14 |
[BOJ] #15649) N๊ณผ M(1) (Python, Back tracking) (1) | 2023.10.01 |
[BOJ] 11729 ํ๋ ธ์ด ํ ์ด๋ ์์ (Python, Recursion) (0) | 2023.09.30 |
[ํ๋ก๊ทธ๋๋จธ์ค] ๊ด๋ฌผ ์บ๊ธฐ (Python, ๊ตฌํ) (0) | 2023.09.30 |
๋๊ธ