λ¬Έμ - Baekjoon 1006 : μ΅κ²©μ μ΄λΌκΈ°
https://www.acmicpc.net/problem/1006
1006λ²: μ΅κ²©μ μ΄λΌκΈ°
νλμ νΉμ μλλ‘ μΈμ ν λ μμμ 컀λ²ν μ μλ λ°°μΉλ (2,10), (9,16), (4,5), (7,8), (13,14) μ΄λ€. κ·Έλ¦¬κ³ λλ¨Έμ§ 6κ° κ΅¬μμ κ°κ° νλμ νΉμ μλλ‘ μ»€λ²ν μ μλ€. κ·Έλ¬λ―λ‘ μ΅μ 11κ° νΉμ μ
www.acmicpc.net
ν΅μ¬
"νΉμμλ μ΅μ λ°°μΉ κ³μ°"
λ΄μ©
λ νμΌλ‘ ꡬμ±λ nκ°μ μ΄λ‘ μ΄λ£¨μ΄μ Έ μμΌλ©°, κ° μΉΈμλ μ μ μκ° μ£Όμ΄μ§λλ€. λͺ©νλ μ£Όμ΄μ§ 쑰건 νμμ νΉμ μλλ₯Ό λ°°μΉνμ¬ λͺ¨λ ꡬμμ μ μ ν 컀λ²νλ λ° νμν μ΅μ μλ μλ₯Ό κ³μ°νλ κ²μ λλ€. νΉμ μλλ μΈμ ν λ ꡬμμ λμμ 컀λ²ν μ μμΌλ©°, ν μλκ° μ»€λ²ν μ μλ μ μ μ΄ μλ mμ μ΄κ³Όν μ μμ΅λλ€.
μ½λ
def solve(dp_state):
# dp ν
μ΄λΈ μ΄κΈ°ν. 4κ°μ§ μνλ₯Ό κ°κ³ , κ° μνλ n+1μ κΈΈμ΄λ₯Ό κ°μ΅λλ€.
dp = [[2 * n] * (n + 1) for _ in range(4)]
dp[dp_state][-1] = 0 # μ νλ μνμ λ§μ§λ§ ꡬμμ 0μΌλ‘ μ΄κΈ°ν
for index in range(n):
for state in range(4):
# κ° μνμ λ°λΌ μ΄μ ꡬμμμμ μ΅μ μλ μλ₯Ό νμ¬ κ΅¬μμ μ μ©
dp[0][index] = min(dp[0][index], dp[state][index - 1] + int(state & 1 == 0) + int(state & 2 == 0))
# νμ¬ κ΅¬μκ³Ό μΈμ ꡬμ λͺ¨λλ₯Ό 컀λ²ν μ μλ κ²½μ°λ₯Ό νμΈ
if enemy[0][index] + enemy[1][index] <= m:
dp[0][index] = min(dp[0][index], dp[0][index - 1] + 1)
# νμ¬ κ΅¬μκ³Ό λ€μ ꡬμ(첫 λ²μ§Έ ν)μ 컀λ²ν μ μλ κ²½μ°λ₯Ό νμΈ
if index < n - 1 and enemy[0][index] + enemy[0][index + 1] <= m:
dp[1][index] = min(dp[0][index - 1] + 2, dp[2][index - 1] + 1)
# νμ¬ κ΅¬μκ³Ό λ€μ ꡬμ(λ λ²μ§Έ ν)μ 컀λ²ν μ μλ κ²½μ°λ₯Ό νμΈ
if index < n - 1 and enemy[1][index] + enemy[1][index + 1] <= m:
dp[2][index] = min(dp[0][index - 1] + 2, dp[1][index - 1] + 1)
# λ νμ νμ¬ κ΅¬μκ³Ό λ€μ ꡬμμ λͺ¨λ 컀λ²ν μ μλ κ²½μ°λ₯Ό νμΈ
if index < n - 1 and enemy[0][index] + enemy[0][index + 1] <= m and enemy[1][index] + enemy[1][index + 1] <= m:
dp[3][index] = dp[0][index - 1] + 2
return dp
# ν
μ€νΈ μΌμ΄μ€ μν
for _ in range(int(input())):
n, m = map(int, input().split()) # n: ꡬμ μ, m: μ΅λ μ»€λ² κ°λ₯ν μ μ μ
enemy = [[*map(int, input().split()), 0] for _ in range(2)] # κ° νμ μ μ μ
result = solve(0)[0][n - 1] # κΈ°λ³Έ μνμμ μ΅μ μλ μ κ³μ°
# 첫 λ²μ§Έμ λ§μ§λ§ ꡬμμ΄ ν¨κ» μ»€λ² κ°λ₯ν κ²½μ°μ μ΅μ μλ μ κ³μ°
if enemy[0][0] + enemy[0][n - 1] <= m:
dp_temp = solve(1)
result = min(result, dp_temp[2][n - 2] + 1, dp_temp[0][n - 2] + 2)
if enemy[1][0] + enemy[1][n - 1] <= m:
dp_temp = solve(2)
result = min(result, dp_temp[1][n - 2] + 1, dp_temp[0][n - 2] + 2)
if enemy[0][0] + enemy[0][n - 1] <= m and enemy[1][0] + enemy[1][n - 1] <= m:
result = min(result, solve(3)[0][n - 2] + 2)
print(result) # κ³μ°λ μ΅μ μλ μ μΆλ ₯
μ½λμ ν΅μ¬ ꡬμ±
1. solve ν¨μ:
- μν : κ° κ΅¬μμ μ΄λ»κ² 컀λ²ν μ§μ λ°λΌ κ°λ₯ν λͺ¨λ μνλ₯Ό κ³ λ €νμ¬ μ΅μ μλ μλ₯Ό κ³μ°ν©λλ€.
- λμ λ°©μ:
- dp λ°°μ΄μ μ΄κΈ°ννμ¬ κ° μνλ³λ‘ κ° κ΅¬μκΉμ§ νμν μ΅μ μλ μλ₯Ό μ μ₯ν©λλ€. λ€ κ°μ§ μνλ λ€μκ³Ό κ°μ΅λλ€:
- νμ¬ κ΅¬μμ μλ‘μ΄ μλλ‘ μ»€λ²νλ κ²½μ°.
- νμ¬ κ΅¬μκ³Ό λ€μ ꡬμ(첫 λ²μ§Έ ν)μ ν¨κ» 컀λ²νλ κ²½μ°.
- νμ¬ κ΅¬μκ³Ό λ€μ ꡬμ(λ λ²μ§Έ ν)μ ν¨κ» 컀λ²νλ κ²½μ°.
- λ νμ νμ¬ κ΅¬μκ³Ό λ€μ ꡬμμ λͺ¨λ 컀λ²νλ κ²½μ°.
- κ° μνμ λ°λΌ μ΄μ ꡬμμμμ μ΅μ μλ μλ₯Ό κΈ°λ°μΌλ‘ νμ¬ κ΅¬μμ μ΅μ μλ μλ₯Ό κ³μ°ν©λλ€.
- dp λ°°μ΄μ μ΄κΈ°ννμ¬ κ° μνλ³λ‘ κ° κ΅¬μκΉμ§ νμν μ΅μ μλ μλ₯Ό μ μ₯ν©λλ€. λ€ κ°μ§ μνλ λ€μκ³Ό κ°μ΅λλ€:
2. λ©μΈ λ‘μ§:
- μν : ν μ€νΈ μΌμ΄μ€μ λν΄ μ λ ₯μ λ°κ³ , solve ν¨μλ₯Ό νΈμΆνμ¬ κ²°κ³Όλ₯Ό κ³μ°νκ³ μΆλ ₯ν©λλ€.
- λμ λ°©μ:
- κ° νμ μ μ μλ₯Ό μ λ ₯λ°μ΅λλ€.
- κΈ°λ³Έ μν(첫 λ²μ§Έ μν)μμ μμνμ¬ μ΅μ μλ μλ₯Ό κ³μ°ν©λλ€.
- νΉλ³ν κ²½μ°(첫 λ²μ§Έμ λ§μ§λ§ ꡬμμ΄ ν¨κ» μ»€λ² κ°λ₯ν κ²½μ°)λ₯Ό μΆκ°λ‘ κ³ λ €νμ¬ κ²°κ³Όλ₯Ό μ΅μ νν©λλ€.
μ½λμ μ£Όμ κ³ λ € μ¬ν
- λμ νλ‘κ·Έλλ°(Dynamic Programming): μ΄ λ¬Έμ λ λμ νλ‘κ·Έλλ°μ ν΅ν΄ ν¨μ¨μ μΌλ‘ ν΄κ²°λ©λλ€. κ° κ΅¬μμ 컀λ²νλ λ° νμν μ΅μ μλ μλ μ΄μ ꡬμμ μνμ λ°λΌ λ¬λΌμ§λ―λ‘, μ΄λ₯Ό κ³ λ €νμ¬ κ° κ΅¬μλ³λ‘ μ΅μ μ ν΄λ₯Ό μ°Ύμ΅λλ€.
- μν κ³ λ €: κ° κ΅¬μμ 컀λ²νλ λ€μν λ°©λ²(μν)μ κ³ λ €ν΄μΌ ν©λλ€. μ΄λ κ° κ΅¬μμ΄ λ 립μ μΌλ‘ 컀λ²λ μλ μκ³ , μΈμ ν ꡬμκ³Ό ν¨κ» 컀λ²λ μλ μμμ μλ―Έν©λλ€.
- κ²½κ³ μ‘°κ±΄ μ²λ¦¬: 첫 λ²μ§Έμ λ§μ§λ§ ꡬμμ΄ νΉλ³ν κ²½μ°λ₯Ό ꡬμ±ν μ μμΌλ―λ‘, μ΄λ₯Ό λ³λλ‘ μ²λ¦¬ν©λλ€.
'μ½λ©ν μ€νΈ(Baekjoon)' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[python] Baekjoon 1009 : λΆμ°μ²λ¦¬ (0) | 2024.03.08 |
---|---|
[python] Baekjoon 1007 : λ²‘ν° λ§€μΉ (0) | 2024.01.22 |
[python] Baekjoon 1005 : ACM Craft (0) | 2024.01.21 |
[python] Baekjoon 1004 : μ΄λ¦° μμ (0) | 2024.01.20 |
[python] Baekjoon 1003 : νΌλ³΄λμΉ ν¨μ (0) | 2024.01.20 |
λκΈ