λ¬Έμ
λ°±μ€ 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μ΄λ€.
'π‘ μ½λ©ν μ€νΈ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[νλ‘κ·Έλλ¨Έμ€] N-Queen (0) | 2024.08.07 |
---|---|
[νλ‘κ·Έλλ¨Έμ€] μμμ°ΎκΈ° (0) | 2024.08.06 |
[λ°±μ€] 1135. λ΄μ€ μ νκΈ° (0) | 2024.08.03 |
[λ°±μ€] 1927. μ΅μ ν & 11279. μ΅λ ν (0) | 2024.07.31 |
[λ°±μ€] 14888. μ°μ°μ λΌμλ£κΈ° (2) | 2024.07.14 |
λ¬Έμ
λ°±μ€ 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μ΄λ€.
'π‘ μ½λ©ν μ€νΈ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[νλ‘κ·Έλλ¨Έμ€] N-Queen (0) | 2024.08.07 |
---|---|
[νλ‘κ·Έλλ¨Έμ€] μμμ°ΎκΈ° (0) | 2024.08.06 |
[λ°±μ€] 1135. λ΄μ€ μ νκΈ° (0) | 2024.08.03 |
[λ°±μ€] 1927. μ΅μ ν & 11279. μ΅λ ν (0) | 2024.07.31 |
[λ°±μ€] 14888. μ°μ°μ λΌμλ£κΈ° (2) | 2024.07.14 |