-
[DP] μ°μνλ κ²μ μ νν μ μμ λ (BOJ 2579, 2156)Algorithms in Python/baekjoon 2021. 1. 18. 03:27
π λ°±μ€ 2579 κ³λ¨ μ€λ₯΄κΈ°
λ¬Έμ
κ³λ¨ μ€λ₯΄κΈ° κ²μμ κ³λ¨ μλ μμμ λΆν° κ³λ¨ κΌλκΈ°μ μμΉν λμ°©μ κΉμ§ κ°λ κ²μμ΄λ€. <κ·Έλ¦Ό 1>κ³Ό κ°μ΄ κ°κ°μ κ³λ¨μλ μΌμ ν μ μκ° μ°μ¬ μλλ° κ³λ¨μ λ°μΌλ©΄ κ·Έ κ³λ¨μ μ°μ¬ μλ μ μλ₯Ό μ»κ² λλ€.
μλ₯Ό λ€μ΄ <κ·Έλ¦Ό 2>μ κ°μ΄ μμμ μμλΆν° 첫 λ²μ§Έ, λ λ²μ§Έ, λ€ λ²μ§Έ, μ¬μ― λ²μ§Έ κ³λ¨μ λ°μ λμ°©μ μ λλ¬νλ©΄ μ΄ μ μλ 10 + 20 + 25 + 20 = 75μ μ΄ λλ€.
κ³λ¨ μ€λ₯΄λ λ°λ λ€μκ³Ό κ°μ κ·μΉμ΄ μλ€.
- κ³λ¨μ ν λ²μ ν κ³λ¨μ© λλ λ κ³λ¨μ© μ€λ₯Ό μ μλ€. μ¦, ν κ³λ¨μ λ°μΌλ©΄μ μ΄μ΄μ λ€μ κ³λ¨μ΄λ, λ€μ λ€μ κ³λ¨μΌλ‘ μ€λ₯Ό μ μλ€.
- μ°μλ μΈ κ°μ κ³λ¨μ λͺ¨λ λ°μμλ μ λλ€. λ¨, μμμ μ κ³λ¨μ ν¬ν¨λμ§ μλλ€.
- λ§μ§λ§ λμ°© κ³λ¨μ λ°λμ λ°μμΌ νλ€.
λ°λΌμ 첫 λ²μ§Έ κ³λ¨μ λ°κ³ μ΄μ΄ λ λ²μ§Έ κ³λ¨μ΄λ, μΈ λ²μ§Έ κ³λ¨μΌλ‘ μ€λ₯Ό μ μλ€. νμ§λ§, 첫 λ²μ§Έ κ³λ¨μ λ°κ³ μ΄μ΄ λ€ λ²μ§Έ κ³λ¨μΌλ‘ μ¬λΌκ°κ±°λ, 첫 λ²μ§Έ, λ λ²μ§Έ, μΈ λ²μ§Έ κ³λ¨μ μ°μν΄μ λͺ¨λ λ°μ μλ μλ€.
κ° κ³λ¨μ μ°μ¬ μλ μ μκ° μ£Όμ΄μ§ λ μ΄ κ²μμμ μ»μ μ μλ μ΄ μ μμ μ΅λκ°μ ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
μ λ ₯
μ λ ₯μ 첫째 μ€μ κ³λ¨μ κ°μκ° μ£Όμ΄μ§λ€.
λμ§Έ μ€λΆν° ν μ€μ νλμ© μ μΌ μλμ λμΈ κ³λ¨λΆν° μμλλ‘ κ° κ³λ¨μ μ°μ¬ μλ μ μκ° μ£Όμ΄μ§λ€. κ³λ¨μ κ°μλ 300μ΄νμ μμ°μμ΄κ³ , κ³λ¨μ μ°μ¬ μλ μ μλ 10,000μ΄νμ μμ°μμ΄λ€.
μΆλ ₯
첫째 μ€μ κ³λ¨ μ€λ₯΄κΈ° κ²μμμ μ»μ μ μλ μ΄ μ μμ μ΅λκ°μ μΆλ ₯νλ€.
β λ¬Έμ μ ν΅μ¬
• κ³λ¨μ ν λ²μ ν κ³λ¨ or λ κ³λ¨μ© μ€λ₯Ό μ μλ€.
• μ°μλ μΈ κ°μ κ³λ¨μ λͺ¨λ λ°μΌλ©΄ μλλ€. μμμ μ κ³λ¨μ ν¬ν¨x
=> μ κ³λ¨κΉμ§μ μ μμ μ΅λκ°μ μ΄μ©νμ¬ μ°¨λ‘λλ‘ ν΄κ²°νλ©΄ λλ€. *DP
μΈ λ²μ§Έ κ³λ¨ μ΄μμΌλ, iλ²μ§Έ κ³λ¨μ λ°λ κ²½μ°μ μ
- i - 2λ²μ§Έ κ³λ¨μ λ°μ§ μκ³ , i - 1λ²μ§Έ κ³λ¨μ λ°λ κ²½μ° (X O O)
- i - 2λ²μ§Έ κ³λ¨μ λ°κ³ , i - 1λ²μ§Έ κ³λ¨μ λ°μ§ μλ κ²½μ° (O X O)
dp[i] = max(dp[i - 3] + arr[i - 1], dp[i - 2]) + arr[i]
β μ 체 μ½λ
import sys input = sys.stdin.readline n = int(input()) arr = [0] * (n + 1) dp = [0] * (n + 1) for i in range(1, n + 1): arr[i] = int(input()) dp[1] = arr[1] if n == 1: print(dp[1]) exit(0) dp[2] = dp[1] + arr[2] if n == 2: print(dp[2]) exit(0) for i in range(3, n + 1): dp[i] = max(dp[i - 3] + arr[i - 1], dp[i - 2]) + arr[i] print(dp[n])
for μ μ μΈλ±μ€κ° 1, 2μΌ λ μ²λ¦¬λ₯Ό μνλ©΄ μΈλ±μ€ μ€λ₯κ° λλ€.
πλ°±μ€ 2156 ν¬λμ£Ό μμ
λ¬Έμ
ν¨μ£Όλ ν¬λμ£Ό μμνμ κ°λ€. κ·Έ κ³³μ κ°λλ, ν μ΄λΈ μμ λ€μν ν¬λμ£Όκ° λ€μ΄μλ ν¬λμ£Ό μμ΄ μΌλ ¬λ‘ λμ¬ μμλ€. ν¨μ£Όλ ν¬λμ£Ό μμμ νλ €κ³ νλλ°, μ¬κΈ°μλ λ€μκ³Ό κ°μ λ κ°μ§ κ·μΉμ΄ μλ€.
- ν¬λμ£Ό μμ μ ννλ©΄ κ·Έ μμ λ€μ΄μλ ν¬λμ£Όλ λͺ¨λ λ§μ μΌ νκ³ , λ§μ νμλ μλ μμΉμ λ€μ λμμΌ νλ€.
- μ°μμΌλ‘ λμ¬ μλ 3μμ λͺ¨λ λ§μ€ μλ μλ€.
ν¨μ£Όλ λ μ μλ λλ‘ λ§μ μμ ν¬λμ£Όλ₯Ό λ§λ³΄κΈ° μν΄μ μ΄λ€ ν¬λμ£Ό μμ μ νν΄μΌ ν μ§ κ³ λ―Όνκ³ μλ€. 1λΆν° nκΉμ§μ λ²νΈκ° λΆμ΄ μλ nκ°μ ν¬λμ£Ό μμ΄ μμλλ‘ ν μ΄λΈ μμ λμ¬ μκ³ , κ° ν¬λμ£Ό μμ λ€μ΄μλ ν¬λμ£Όμ μμ΄ μ£Όμ΄μ‘μ λ, ν¨μ£Όλ₯Ό λμ κ°μ₯ λ§μ μμ ν¬λμ£Όλ₯Ό λ§μ€ μ μλλ‘ νλ νλ‘κ·Έλ¨μ μμ±νμμ€.
μλ₯Ό λ€μ΄ 6κ°μ ν¬λμ£Ό μμ΄ μκ³ , κ°κ°μ μμ μμλλ‘ 6, 10, 13, 9, 8, 1 λ§νΌμ ν¬λμ£Όκ° λ€μ΄ μμ λ, 첫 λ²μ§Έ, λ λ²μ§Έ, λ€ λ²μ§Έ, λ€μ― λ²μ§Έ ν¬λμ£Ό μμ μ ννλ©΄ μ΄ ν¬λμ£Ό μμ΄ 33μΌλ‘ μ΅λλ‘ λ§μ€ μ μλ€.
μ λ ₯
첫째 μ€μ ν¬λμ£Ό μμ κ°μ nμ΄ μ£Όμ΄μ§λ€. (1≤n≤10,000) λμ§Έ μ€λΆν° n+1λ²μ§Έ μ€κΉμ§ ν¬λμ£Ό μμ λ€μ΄μλ ν¬λμ£Όμ μμ΄ μμλλ‘ μ£Όμ΄μ§λ€. ν¬λμ£Όμ μμ 1,000 μ΄νμ μμ΄ μλ μ μμ΄λ€.
μΆλ ₯
첫째 μ€μ μ΅λλ‘ λ§μ€ μ μλ ν¬λμ£Όμ μμ μΆλ ₯νλ€.
β λ¬Έμ μ ν΅μ¬
• μ°μμΌλ‘ λμ¬μλ 3μμ μ νν μ μλ€.
• μμλλ‘ ν¬λμ£Όλ₯Ό μμ/μμX ν λμ μ΅λλ‘ λ§μ€ μ μλ ν¬λμ£Όμ μμ ꡬνμ¬μΌ νλ€.
• μ°μν΄μ μ ννμ§ μμλ λλ€. (κ³λ¨ μ€λ₯΄κΈ° λ¬Έμ μ λ€λ₯Έ μ )
=> νμ¬ μμλ³΄λ€ μμ μμμ ν¬λμ£Όμ μ΅λκ°μ μ΄μ©νμ¬ ν΄κ²°νλ©΄ λλ€. *DP
i >= 3 μΌ λ, iλ²μ§Έ ν¬λμ£Όμ κ²½μ°μ μλ λ€μκ³Ό κ°λ€.
i - 3 i - 2 i - 1 i λ§μμ§ μλλ€ λ§μ λ€ λ§μ λ€ λ§μμ§ μλλ€ λ§μ λ€ λ§μμ§ μλλ€ dp[i] = max(dp[i - 3] + arr[i - 1] + arr[i], dp[i - 2] + arr[i], dp[i - 1])
β μ 체 μ½λ
import sys input = sys.stdin.readline n = int(input()) arr = [0] * (n + 1) dp = [0] * (n + 1) for i in range(1, n + 1): arr[i] = int(input()) dp[1] = arr[1] if n == 1: print(dp[1]) exit(0) dp[2] = dp[1] + arr[2] if n == 2: print(dp[2]) exit(0) for i in range(3, n + 1): # x o o / x o / x dp[i] = max(dp[i - 3] + arr[i - 1] + arr[i], dp[i - 2] + arr[i], dp[i - 1]) print(dp[n])
'Algorithms in Python > baekjoon' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[DFS/BFS] BOJ 18405 κ²½μμ μ μΌ (0) 2021.02.01 [DFS/BFS] BOJ 16234 μΈκ΅¬ μ΄λ (0) 2021.02.01 [Binary Search] BOJ 2470 λ μ©μ‘ (0) 2021.01.27 [Binary Search] BOJ 2110 곡μ κΈ° μ€μΉ (0) 2021.01.24 [Backtracking] BOJ 2580 μ€λμΏ (0) 2021.01.19