βοΈ λ¬Έμ
[λ°±μ€/BOJ] 11722λ²: κ°μ₯ κΈ΄ κ°μνλ λΆλΆ μμ΄(https://www.acmicpc.net/problem/11722)
μμ΄ Aκ° μ£Όμ΄μ‘μ λ, κ°μ₯ κΈ΄ κ°μνλ λΆλΆ μμ΄μ ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
μλ₯Ό λ€μ΄, μμ΄ A = {10, 30, 10, 20, 20, 10} μΈ κ²½μ°μ κ°μ₯ κΈ΄ κ°μνλ λΆλΆ μμ΄μ A = {10, 30, 10, 20, 20, 10} μ΄κ³ , κΈΈμ΄λ 3μ΄λ€.
π€ μ μΆλ ₯ μμ
π§ λμ΄λ/μμ μκ°
β λμ΄λ: solved.ac κΈ°μ€ S2
β μμ μκ°: μΈ‘μ X
β κΆμ₯ μκ°: 1μκ° 15λΆ
π‘ νμ΄
1) λ¬Έμ μ΄ν΄
μ€λͺ κ³Ό μμκ° μμ£Ό κΉλνλ€.
μμ΄ Aκ° μ λ ₯μΌλ‘ λ€μ΄μμ λ 'κ°μ₯ κΈ΄ κ°μνλ λΆλΆ μμ΄'μ μ°ΎμΌλ©΄ λλλ°, μ£Όμν μ μ μμ΄μ μ΄λ£¨λ μ«μκ° μ°μλμ§ μμμλ μλ€λ κ²μ΄λ€. λ§μΉ¨ λ¬Έμ μμ 보μ¬μ€ μμκ° μ΄ κ²½μ°μ ν΄λΉνλ€.
2) μμ΄λμ΄ νλ¦ λ° μ½λ
β DP ν μ΄λΈ μ μ λ° μ΄κΈ°κ° μ±μ°κΈ°
λ¬Έμ λ₯Ό 보μλ§μ 'DP ν μ΄λΈμ iλ²μ§Έ μμ = μμ΄ Aμ iλ²μ§Έ μμκΉμ§ μμ λ κ°μ₯ κΈ΄ κ°μ λΆλΆ μμ΄μ κΈΈμ΄'λ‘ dp ν μ΄λΈμ μ μν΄μΌκ² λ€λ μκ°μ΄ λ€μλ€. μ΄ λΆλΆμ λλ¦ μ μΊμΉν κ² κ°λ€!
dp ν μ΄λΈμ μ΄κΈ°κ°μ λͺ¨λ 0μΌλ‘ λκ³ μμ΄ Aμ 첫 λ²μ§Έ μμλ₯Ό μλ―Ένλ dp[0]λ§ 1λ‘ μ ν ν΄μ£Όμλ€.
β‘ μ νμ μ λ
μ νμ μ λ λ¨κ³κ° μ‘°κΈ μ½μ§ μμλ€. μμ λ μ ν΅κ³Όν΄μ μλ²½ν μ λ΅μ΄λΌκ³ μκ°νλλ° νλ Έμ΅λλ€λ₯Ό λ°μ μμ΄λμ΄μ μ€λ΅ μ½λλ μλμ κ°λ€.
β μ€λ΅ μ½λ
for i in range(1, N):
if A[i-1] > A[i]:
dp[i] = dp[i-1]+1
else:
dp[i] = dp[i-1]
print(dp[N-1])
- for i in range(1, N)
- dp ν μ΄λΈμμ μμ΄ Aμ 첫 λ²μ§Έ μμμ ν΄λΉνλ κ°μ μ±μ쀬기 λλ¬Έμ λ€μ μμλΆν° dp ν μ΄λΈμ νλμ© μ±μ°κΈ° μν΄ 1λΆν° N-1κΉμ§ λ°λ³΅λ¬Έμ λλ¦°λ€.
- dp[i] = dp[i-1]+1
- νμ¬ νμΈ μ€μΈ μμ΄ Aμ iλ²μ§Έ κ°μ λν΄ μ΄μ κ°μ΄ νμ¬ κ°λ³΄λ€ ν¬λ©΄ κ°μνλ ꡬκ°μ΄κΈ° λλ¬Έμ νμ¬κΉμ§μ κ°μ λΆλΆ μμ΄ κΈΈμ΄λ₯Ό 1 μ¦κ°μν¨λ€.
- print(dp[N-1])
- dp ν μ΄λΈμ΄ μ μ±μμ‘λ€λ κ°μ νμ dp ν μ΄λΈμ λ§μ§λ§ κ°μ΄ λ΅μ΄ λλ€.
λλ¦ λ‘μ§μ μ κ°μΆ μμ΄λμ΄λΌκ³ μκ°νλλ° λ무 κΈλ°© μ»· λΉν΄μ λκ° λ¬Έμ μΌμ§ μκ°ν΄λ΄€λ€.
β μ€λ΅ μμΈ λΆμ
- μλͺ» μ λν μ νμ
- A: 4 5 4 5 4 5 → 5-4 ꡬκ°μ΄ κ°μ₯ κΈ΄ κ°μ λΆλΆ μμ΄μ΄λ―λ‘ μ λ΅μ 2κ° λμ΄μΌ νλ€.
- νμ§λ§ λ΄ λ‘μ§λλ‘λΌλ©΄ dp ν μ΄λΈμ [1, 1, 2, 2, 3, 3]μ΄ λμ΄ μ λ΅μΌλ‘ 3μ μΆλ ₯νκ² λλ€.
- μ΄ λ°λ‘λ₯Ό ν΅ν΄ dp[i]λ₯Ό μ±μ°κΈ° μν΄ μ§μ κ°λ§μ νμ©νλ κ² λ¬Έμ μμ κΉ¨λ«κ² λμλ€.
- μλͺ»λ μ΄κΈ°κ° μ€μ
- dp ν μ΄λΈμ μ΄κΈ°κ°μ λͺ¨λ 0μ΄μλ€.
- [3, 3, 3, 3, 3]μ²λΌ μ¦κ°/κ°μκ° μ ν μΌμ΄λμ§ μλ μνμ μμ΄μ΄ μ λ ₯μΌλ‘ λ€μ΄μ¨ κ²½μ°λ₯Ό κ°κ³Όνκ³ μμλ€.
- μμ΄μ μ΄λ£¨κ³ μλ μ«μ νλνλλ κΈΈμ΄ 1μ λΆλΆ μμ΄μ ν΄λΉνκΈ° λλ¬Έμ λͺ¨λ μΈλ±μ€μ μ΄κΈ°κ°μ 1μ΄ λμ΄μΌ νλ€.
β’ μ νμ λ° dp ν μ΄λΈ μ΄κΈ°κ° μμ
DP ν μ΄λΈ μ μλ μ λλ‘ λλ€κ³ νλ¨νκΈ° λλ¬Έμ μ΄λ€ λΆλΆμ λμΉκ³ μλ κ±΄μ§ κ³ λ―Όνλ€κ°, μ±μ§νΌν°νν μ½κ°μ ννΈλ₯Ό λ°μλ€.
dp[i]λ₯Ό μ±μ°κΈ° μν΄μλ μμ΄ Aμ iλ²μ§Έ μμλ₯Ό λ§μ§λ§μΌλ‘ νλ λͺ¨λ λΆλΆ μμ΄μ νμΈν΄μΌ νλ€.
μ΄ λ§μ΄ λ¬΄μ¨ λ§μΈκ° νλ©΄ λ΄κ° μ²μμ ꡬμνλ κ²μ²λΌ μ§μ κ°λ§ λ³΄κ³ dp ν μ΄λΈμ μ±μλκ°λ κ² μλλΌ, λΆλΆ μμ΄μ κΈΈμ΄λ₯Ό λλ €κ°λ©΄μ dp ν μ΄λΈμ μ±μ΄λ€λ λ»μ΄λ€.
i = 1, j = 0 → [10, 30, 10, 20, 20, 10] / 10μ λ§μ§λ§ μμλ‘ κ°λ λΆλΆ μμ΄ μ€ κ°μ λΆλΆ μμ΄μ μ΅λ κΈΈμ΄λ 1(μκΈ° μμ )
i = 2, j = 0 → [10, 30, 10, 20, 20, 10] / 30μ λ§μ§λ§ μμλ‘ κ°λ λΆλΆ μμ΄ μ€ κ°μ λΆλΆ μμ΄μ μ΅λ κΈΈμ΄λ 1(μκΈ° μμ )
i = 2, j = 1 → [10, 30, 10, 20, 20, 10] / 10μ λ§μ§λ§ μμλ‘ κ°λ λΆλΆ μμ΄ μ€ κ°μ λΆλΆ μμ΄μ μ΅λ κΈΈμ΄λ 2
μ κ³Όμ μ λ°λ³΅νλ©΄μ dp ν μ΄λΈμ κ°μ΄ κ°±μ λλλ° μ΄ κ³Όμ μ dp[i] = max(dp[i], dp[j]+1)μ΄λΌλ μμΌλ‘ λνλΌ μ μλ€.
3) μ 체 μ½λ
N = int(input())
A = list(map(int, input().split()))
# DP[i]: A[i]λ₯Ό λ§μ§λ§ μμλ‘ κ°λ κ°μ₯ κΈ΄ κ°μ λΆλΆ μμ΄μ κΈΈμ΄
DP = [1]*N
for i in range(1, N):
for j in range(i):
if A[j] > A[i]:
DP[i] = max(DP[i], DP[j]+1)
print(max(DP))
4) μ΄λ €μ λ μ /λ°°μ΄ μ
π¨ μ΄λ €μ λ μ
- μ νμ ꡬνμ μ΄μ€ forλ¬Έμ΄ νμνλ μ μ μ²μμ΄λΌ μ΄μ€ forλ¬Έ μΈ μκ°μ λͺ»νκ³ λ³΅μ‘ν λ°©λ²μΌλ‘ νμ΄λ₯Ό κ³ λ―Όνκ³ μμλ€.
β λ°°μ΄ μ
- DP μ νμ μ νμ μ λκ° μλͺ μ΄λΌ 머리λ₯Ό λ λ§λνκ² λ§λ€μ΄μ€ νμκ° μλ€.