๋ฌธ์
๋ฐฑ์ค 14501.ํด์ฌ https://www.acmicpc.net/problem/14501
์ฝ๋ (๋ฐํ ์ DP)
๋ฐํ ์ ๋ฐฉ์์์๋ ๋ค์์๋ถํฐ ์ ๊ทผํ๋ฉฐ ์ต์ ์ ์๋ด ์ค์ผ์ค์ ๊ฒฐ์ ํ๋ค.
N = int(input())
table = [list(map(int,input().split())) for _ in range(N)]
dp = [0 for _ in range(N+1)]
for i in range(N)[::-1]:
if i + table[i][0] > N:
dp[i] = dp[i+1]
else:
# i๋ฒ์งธ ๋ ๋ถํฐ ์ป์ ์ ์๋ ์ต๋ ์ด์ต
dp[i] = max(dp[i + table[i][0]] + table[i][1], dp[i + 1])
print(dp[0])
ํ์ด
for i in range(N)[::-1]:
N๋ฒ์งธ ๋ ๋ถํฐ ๊ฑฐ๊พธ๋ก ํ์ํ๋ค.
if i + table[i][0] > N:
dp[i] = dp[i+1]
์๋ด์ด ๊ธฐ๊ฐ์ ์ด๊ณผํ๋ฉด ๋ค์ ๋ ์ ๊ฐ์ ๊ทธ๋๋ก ๊ฐ์ ธ์จ๋ค.
dp[i] = max(dp[i + table[i][0]] + table[i][1], dp[i + 1])
์๋ด์ ์งํํ ๊ฒฝ์ฐ์ ์งํํ์ง ์์ ๊ฒฝ์ฐ ์ค ์ต๋๊ฐ์ ์ ํํ๋ค.
์๊ฐ ๋ณต์ก๋
O(N): ๊ฐ ๋ ์ง๋ฅผ ํ ๋ฒ์ฉ ํ์ธํ๋ฉด์ ์ต์ ์ ์๋ด ์ผ์ ์ ๊ฒฐ์ ํ๋ค.
์ฝ๋ (ํ๋ค์ด DP)
ํ๋ค์ด ๋ฐฉ์์์๋ ์ฌ๊ท๋ฅผ ํ์ฉํ์ฌ ๊ฐ ๋ ์ง์์ ์ ํํ ์ ์๋ ์ต์ ์ ์๋ด์ ์ฐพ๋๋ค.
N = int(input())
table = [list(map(int, input().split())) for _ in range(N)]
dp = [-1 for _ in range(N+1)]
def recur(day):
if day == N:
return 0
if day > N:
return -999999
if dp[day] != -1:
return dp[day]
dp[day] = max(recur(day + table[day][0]) + table[day][1], recur(day + 1))
return dp[day]
recur(0)
print(dp[0])
ํ์ด
if day == N:
return 0
์๋ด์ด ๋๋ ๊ฒฝ์ฐ 0์ ๋ฐํํ๋ค.
if dp[day] != -1:
return dp[day]
์ด๋ฏธ ๊ณ์ฐ๋ ๊ฐ์ด ์๋ค๋ฉด ๊ทธ๋๋ก ๋ฐํํ์ฌ ์ค๋ณต ์ฐ์ฐ์ ๋ฐฉ์งํ๋ค.
dp[day] = max(recur(day + table[day][0]) + table[day][1], recur(day + 1))
ํ์ฌ ์๋ด์ ์งํํ๋ ๊ฒฝ์ฐ์ ์งํํ์ง ์๋ ๊ฒฝ์ฐ ์ค ์ต๋๊ฐ์ ๊ฐฑ์ ํ๋ค.
์๊ฐ ๋ณต์ก๋
O(N): ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ ์ฉํ์ฌ ์ค๋ณต ์ฐ์ฐ์ ์ค์๋ค.
์ฝ๋ (๋ฐฑํธ๋ํน)
๋ฐฑํธ๋ํน ๋ฐฉ์์์๋ ๊ฐ๋ฅํ ๋ชจ๋ ์๋ด ์กฐํฉ์ ํ์ํ๋ฉฐ ์ต๋ ์ด์ต์ ์ฐพ๋๋ค.
def recur(day, money):
global answer
if day > n + 1:
return
if day == n + 1:
answer = max(money, answer)
return
recur(day + table[day][0], money + table[day][1])
recur(day + 1, money)
n = int(input())
table = [[] for _ in range(n+1)]
for i in range(n):
a, b = map(int, input().split())
table[i+1] = [a, b]
answer = 0
recur(1, 0)
print(answer)
ํ์ด
if day > n + 1:
return
์๋ด ์ผ์ ์ ์ด๊ณผํ ๊ฒฝ์ฐ ์ข ๋ฃํ๋ค.
if day == n + 1:
answer = max(money, answer)
return
์๋ด์ด ๋๋ ๊ฒฝ์ฐ, ํ์ฌ๊น์ง ์ป์ ์ด์ต์ ์ต๋๊ฐ์ผ๋ก ๊ฐฑ์ ํ๋ค.
recur(day + table[day][0], money + table[day][1])
์๋ด์ ์งํํ๋ ๊ฒฝ์ฐ ์ฌ๊ท ํธ์ถํ๋ค.
recur(day + 1, money)
์๋ด์ ์งํํ์ง ์๊ณ ๋ค์ ๋ ๋ก ์ด๋ํ๋ค.
์๊ฐ ๋ณต์ก๋
O(2^N): ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ํ๊ธฐ ๋๋ฌธ์ DP๋ณด๋ค ๋นํจ์จ์ ์ด๋ค.
๋น๊ต ๋ฐ ๊ฒฐ๋ก
๋ฐฉ๋ฒ์๊ฐ | ๋ณต์ก๋ | ์ฅ์ | ๋จ์ |
๋ฐํ ์ DP | O(N) | ์ง๊ด์ ์ด๋ฉฐ ๋น ๋ฆ | ๋ฐฐ์ด ํฌ๊ธฐ ์ ํ ์์ |
ํ๋ค์ด DP | O(N) | ์ฌ๊ท ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ ์ฑ์ด ๋์ | ์ฌ๊ท ํธ์ถ๋ก ์ธํ ์ค๋ฒํค๋ ๊ฐ๋ฅ |
๋ฐฑํธ๋ํน | O(2^N) | ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํ์ฌ ์ต์ ํด ๋ณด์ฅ | ๋นํจ์จ์ , N์ด ์ปค์ง๋ฉด ์ฌ์ฉ ๋ถ๊ฐ |
๊ฐ์ฅ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ๋ฐํ ์ DP ๋๋ ํ๋ค์ด DP์ด๋ค.
'๐ก ์ฝ๋ฉํ ์คํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 2805. ๋๋ฌด ์๋ฅด๊ธฐ (0) | 2025.04.06 |
---|---|
[๋ฐฑ์ค] 15654. N๊ณผ M (5) (0) | 2025.04.05 |
[ํ๋ก๊ทธ๋๋จธ์ค] N-Queen (0) | 2024.08.07 |
[ํ๋ก๊ทธ๋๋จธ์ค] ์์์ฐพ๊ธฐ (0) | 2024.08.06 |
[๋ฐฑ์ค] 1135. ๋ด์ค ์ ํ๊ธฐ (0) | 2024.08.03 |
๋ฌธ์
๋ฐฑ์ค 14501.ํด์ฌ https://www.acmicpc.net/problem/14501
์ฝ๋ (๋ฐํ ์ DP)
๋ฐํ ์ ๋ฐฉ์์์๋ ๋ค์์๋ถํฐ ์ ๊ทผํ๋ฉฐ ์ต์ ์ ์๋ด ์ค์ผ์ค์ ๊ฒฐ์ ํ๋ค.
N = int(input())
table = [list(map(int,input().split())) for _ in range(N)]
dp = [0 for _ in range(N+1)]
for i in range(N)[::-1]:
if i + table[i][0] > N:
dp[i] = dp[i+1]
else:
# i๋ฒ์งธ ๋ ๋ถํฐ ์ป์ ์ ์๋ ์ต๋ ์ด์ต
dp[i] = max(dp[i + table[i][0]] + table[i][1], dp[i + 1])
print(dp[0])
ํ์ด
for i in range(N)[::-1]:
N๋ฒ์งธ ๋ ๋ถํฐ ๊ฑฐ๊พธ๋ก ํ์ํ๋ค.
if i + table[i][0] > N:
dp[i] = dp[i+1]
์๋ด์ด ๊ธฐ๊ฐ์ ์ด๊ณผํ๋ฉด ๋ค์ ๋ ์ ๊ฐ์ ๊ทธ๋๋ก ๊ฐ์ ธ์จ๋ค.
dp[i] = max(dp[i + table[i][0]] + table[i][1], dp[i + 1])
์๋ด์ ์งํํ ๊ฒฝ์ฐ์ ์งํํ์ง ์์ ๊ฒฝ์ฐ ์ค ์ต๋๊ฐ์ ์ ํํ๋ค.
์๊ฐ ๋ณต์ก๋
O(N): ๊ฐ ๋ ์ง๋ฅผ ํ ๋ฒ์ฉ ํ์ธํ๋ฉด์ ์ต์ ์ ์๋ด ์ผ์ ์ ๊ฒฐ์ ํ๋ค.
์ฝ๋ (ํ๋ค์ด DP)
ํ๋ค์ด ๋ฐฉ์์์๋ ์ฌ๊ท๋ฅผ ํ์ฉํ์ฌ ๊ฐ ๋ ์ง์์ ์ ํํ ์ ์๋ ์ต์ ์ ์๋ด์ ์ฐพ๋๋ค.
N = int(input())
table = [list(map(int, input().split())) for _ in range(N)]
dp = [-1 for _ in range(N+1)]
def recur(day):
if day == N:
return 0
if day > N:
return -999999
if dp[day] != -1:
return dp[day]
dp[day] = max(recur(day + table[day][0]) + table[day][1], recur(day + 1))
return dp[day]
recur(0)
print(dp[0])
ํ์ด
if day == N:
return 0
์๋ด์ด ๋๋ ๊ฒฝ์ฐ 0์ ๋ฐํํ๋ค.
if dp[day] != -1:
return dp[day]
์ด๋ฏธ ๊ณ์ฐ๋ ๊ฐ์ด ์๋ค๋ฉด ๊ทธ๋๋ก ๋ฐํํ์ฌ ์ค๋ณต ์ฐ์ฐ์ ๋ฐฉ์งํ๋ค.
dp[day] = max(recur(day + table[day][0]) + table[day][1], recur(day + 1))
ํ์ฌ ์๋ด์ ์งํํ๋ ๊ฒฝ์ฐ์ ์งํํ์ง ์๋ ๊ฒฝ์ฐ ์ค ์ต๋๊ฐ์ ๊ฐฑ์ ํ๋ค.
์๊ฐ ๋ณต์ก๋
O(N): ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ ์ฉํ์ฌ ์ค๋ณต ์ฐ์ฐ์ ์ค์๋ค.
์ฝ๋ (๋ฐฑํธ๋ํน)
๋ฐฑํธ๋ํน ๋ฐฉ์์์๋ ๊ฐ๋ฅํ ๋ชจ๋ ์๋ด ์กฐํฉ์ ํ์ํ๋ฉฐ ์ต๋ ์ด์ต์ ์ฐพ๋๋ค.
def recur(day, money):
global answer
if day > n + 1:
return
if day == n + 1:
answer = max(money, answer)
return
recur(day + table[day][0], money + table[day][1])
recur(day + 1, money)
n = int(input())
table = [[] for _ in range(n+1)]
for i in range(n):
a, b = map(int, input().split())
table[i+1] = [a, b]
answer = 0
recur(1, 0)
print(answer)
ํ์ด
if day > n + 1:
return
์๋ด ์ผ์ ์ ์ด๊ณผํ ๊ฒฝ์ฐ ์ข ๋ฃํ๋ค.
if day == n + 1:
answer = max(money, answer)
return
์๋ด์ด ๋๋ ๊ฒฝ์ฐ, ํ์ฌ๊น์ง ์ป์ ์ด์ต์ ์ต๋๊ฐ์ผ๋ก ๊ฐฑ์ ํ๋ค.
recur(day + table[day][0], money + table[day][1])
์๋ด์ ์งํํ๋ ๊ฒฝ์ฐ ์ฌ๊ท ํธ์ถํ๋ค.
recur(day + 1, money)
์๋ด์ ์งํํ์ง ์๊ณ ๋ค์ ๋ ๋ก ์ด๋ํ๋ค.
์๊ฐ ๋ณต์ก๋
O(2^N): ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ํ๊ธฐ ๋๋ฌธ์ DP๋ณด๋ค ๋นํจ์จ์ ์ด๋ค.
๋น๊ต ๋ฐ ๊ฒฐ๋ก
๋ฐฉ๋ฒ์๊ฐ | ๋ณต์ก๋ | ์ฅ์ | ๋จ์ |
๋ฐํ ์ DP | O(N) | ์ง๊ด์ ์ด๋ฉฐ ๋น ๋ฆ | ๋ฐฐ์ด ํฌ๊ธฐ ์ ํ ์์ |
ํ๋ค์ด DP | O(N) | ์ฌ๊ท ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ ์ฑ์ด ๋์ | ์ฌ๊ท ํธ์ถ๋ก ์ธํ ์ค๋ฒํค๋ ๊ฐ๋ฅ |
๋ฐฑํธ๋ํน | O(2^N) | ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํ์ฌ ์ต์ ํด ๋ณด์ฅ | ๋นํจ์จ์ , N์ด ์ปค์ง๋ฉด ์ฌ์ฉ ๋ถ๊ฐ |
๊ฐ์ฅ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ๋ฐํ ์ DP ๋๋ ํ๋ค์ด DP์ด๋ค.
'๐ก ์ฝ๋ฉํ ์คํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 2805. ๋๋ฌด ์๋ฅด๊ธฐ (0) | 2025.04.06 |
---|---|
[๋ฐฑ์ค] 15654. N๊ณผ M (5) (0) | 2025.04.05 |
[ํ๋ก๊ทธ๋๋จธ์ค] N-Queen (0) | 2024.08.07 |
[ํ๋ก๊ทธ๋๋จธ์ค] ์์์ฐพ๊ธฐ (0) | 2024.08.06 |
[๋ฐฑ์ค] 1135. ๋ด์ค ์ ํ๊ธฐ (0) | 2024.08.03 |