파이썬 μ•Œκ³ λ¦¬μ¦˜

[μ΄μ½”ν…Œ Ch16-32] μ •μˆ˜ μ‚Όκ°ν˜• (DP)

은진 2022. 4. 19. 20:50

πŸ‘©πŸ»β€πŸ’»λ¬Έμ œμ„€λͺ…

[μ΄μ½”ν…Œ Ch16-32] μ •μˆ˜ μ‚Όκ°ν˜• (DP)
μ΄μ½”ν…Œ

✍️Idea Sketch

λ¬Έμ œμš”μ•½

맨 μœ„μΈ΅ 7λΆ€ν„° μ‹œμž‘ν•΄μ„œ μ•„λž˜μ— μžˆλŠ” 수 쀑 ν•˜λ‚˜λ₯Ό μ„ νƒν•˜μ—¬ μ•„λž˜μΈ΅μœΌλ‘œ λ‚΄λ €μ˜¬ λ•Œ, μ΄μ œκΉŒμ§€ μ„ νƒλœ 수의 합이 μ΅œλŒ€κ°€ λ˜λŠ” 경둜λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ. μ•„λž˜μΈ΅μ— μžˆλŠ” μˆ˜λŠ” ν˜„μž¬ μΈ΅μ—μ„œ μ„ νƒλœ 수의 λŒ€κ°μ„  μ™Όμͺ½ λ˜λŠ” λŒ€κ°μ„  였λ₯Έμͺ½μ— μžˆλŠ” 것 μ€‘μ—μ„œλ§Œ 선택할 수 μžˆλ‹€.


μ‹œκ°„λ³΅μž‘λ„

O(n)

μœ„μ—μ„œλΆ€ν„° μ•„λž˜κΉŒμ§€ λͺ¨λ“  수λ₯Ό ν•œ λ²ˆμ”© νƒμƒ‰ν•˜λ―€λ‘œ O(n)이닀. μ—¬κΈ°μ„œ n은 μˆœμ°¨νƒμƒ‰μ„ μ˜λ―Έν•˜λ©°, 문제의 μ‚Όκ°ν˜•μ˜ 크기 nκ³ΌλŠ” λ‹€λ₯΄λ‹€.


μ•Œκ³ λ¦¬μ¦˜ : λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°


βœοΈλ‚΄ μ†ŒμŠ€μ½”λ“œ

  • μ•„λž˜μΈ΅μ— μžˆλŠ” μˆ˜λŠ” ν˜„μž¬ μΈ΅μ—μ„œ μ„ νƒλœ 수의 λŒ€κ°μ„  μ™Όμͺ½ λ˜λŠ” λŒ€κ°μ„  였λ₯Έμͺ½μ— μžˆλŠ” 것 μ€‘μ—μ„œλ§Œ 선택할 수 μžˆλ‹€. λ”°λΌμ„œ dp[i-1][j]와 dp[i-1][j-1] 쀑 더 큰 값을 μ„ νƒν•˜λ©΄ λœλ‹€.
  • μ•„λž˜μΈ΅μ— μžˆλŠ” μˆ˜λŠ” ν˜„μž¬ μΈ΅μ—μ„œ μ„ νƒλœ 수의 λŒ€κ°μ„  μ™Όμͺ½ λ˜λŠ” λŒ€κ°μ„  였λ₯Έμͺ½μ— μžˆλŠ” 것 μ€‘μ—μ„œλ§Œ 선택할 수 μžˆλ‹€. 이 λ•Œ κ°€μž₯ μ™Όμͺ½μ— μžˆλŠ” μˆ˜λŠ” λŒ€κ°μ„  μ™Όμͺ½μ˜ μˆ˜κ°€ μ—†κ³ , κ°€μž₯ 였λ₯Έμͺ½μ— μžˆλŠ” μˆ˜λŠ” λŒ€κ°μ„  였λ₯Έμͺ½μ˜ μˆ˜κ°€ μ—†μ–΄ IndexErrorκ°€ λ°œμƒν•œλ‹€. 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μž…λ ₯κ°’ μ–‘μͺ½μ— 0 데이터λ₯Ό μΆ”κ°€ν•˜μ—¬ 배열을 ν™•μž₯ν•΄μ€€λ‹€.
  • dp[i][0]의 경우 dp[i-1][0]λŠ” 탐색할 수 μžˆμ§€λ§Œ dp[i-1][-1]은 IndexError둜 탐색할 수 μ—†λ‹€. 그리고 dp[i][n-1]도 dp[i-1][n-1]은 IndexError둜 탐색할 수 μ—†μ§€λ§Œ dp[i-1][n-2]λŠ” 탐색할 수 μžˆλ‹€.

μ •μˆ˜μ‚Όκ°ν˜•


전체 μ½”λ“œ

    import sys
    si = sys.stdin.readline

    n = int(si())
    dp = []
    for _ in range(n):
        arr = [0] + list(map(int, si().split())) + [0]
        dp.append(arr)

    for i in range(1, n):
        for j in range(1, i+2):
            dp[i][j] += max(dp[i-1][j], dp[i-1][j-1])

    print(max(dp[n-1]))