[BOJ] #15486 ํ‡ด์‚ฌ2 (Python, Dynamic Programming, ์‹œ๊ฐ„ ์ดˆ๊ณผ ํ•ด๊ฒฐ)

    ๋ฐ˜์‘ํ˜•

    ๐ŸŒฑ ๋ฌธ์ œ

     

    15486๋ฒˆ: ํ‡ด์‚ฌ 2

    ์ฒซ์งธ ์ค„์— N (1 ≤ N ≤ 1,500,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— Ti์™€ Pi๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด์„œ ์ฃผ์–ด์ง€๋ฉฐ, 1์ผ๋ถ€ํ„ฐ N์ผ๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ Ti ≤ 50, 1 ≤ Pi ≤ 1,000)

    www.acmicpc.net

    https://www.acmicpc.net/problem/15486

    ํ‡ด์‚ฌ์ผ๊ณผ ๊ฐ ์ผ๋งˆ๋‹ค ์ƒ๋‹ด์— ์†Œ์š”๋˜๋Š” ์ผ์ˆ˜์™€ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ธˆ์•ก์ด ์ฃผ์–ด์งˆ ๋•Œ, ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ด์ต์„ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

    ๋ฐฑ์ค€ 14501 ํ‡ด์‚ฌ ๋ฌธ์ œ์™€ ๊ฐ™์€ ๋ฌธ์ œ์ธ๋ฐ, ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ค„์—ฌ์„œ ์ œ์ถœํ•ด์•ผ ๋งž์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์„ธ์ƒ ๋ฌด์„œ์šด ์‹œ๊ฐ„ ์ดˆ๊ณผ,,

     

    ๐ŸŒฑ ํ’€์ด 1 - ์‹œ๊ฐ„ ์ดˆ๊ณผ

    dp = [0 for _ in range(n + 1)]
    
    for i in range(n):
        for j in range(i + meetings[i][0], n + 1):  # i์ผ ์ƒ๋‹ด ์ง„ํ–‰ํ–ˆ์„ ๋•Œ ์ƒ๋‹ด ๊ฐ€๋Šฅํ•œ ๋‚ ๋ถ€ํ„ฐ ๋Œ๊ธฐ
            dp[j] = max(dp[j], dp[i] + meetings[i][1])
    
    print(dp[-1])
    • dp[i]์—๋Š” i์ผ๊นŒ์ง€ ์ผํ–ˆ์„ ๋•Œ์˜ ์ตœ๋Œ€ ์ˆ˜์ต์ด ๋‹ด๊น๋‹ˆ๋‹ค.
    • ์ด ํ’€์ด์—์„œ๋Š” dp ๋ฐฐ์—ด์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ฑ„์›๋‹ˆ๋‹ค. ์ฆ‰, 1์ผ๋ถ€ํ„ฐ n์ผ๊นŒ์ง€ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ˆ˜์ต์„ ๋ชจ๋‘ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.
    • 2์ค‘ for๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ i์ผ์— ์‹œ์ž‘ํ•œ ์ƒ๋‹ด์ด ๋๋‚˜๋Š” ๋‚ ๋ถ€ํ„ฐ ํ‡ด์‚ฌ์ผ๊นŒ์ง€ ๋๊นŒ์ง€ ์ˆœํšŒํ•ฉ๋‹ˆ๋‹ค.
    • ๋”ฐ๋ผ์„œ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰๋‚ ์„ ๋ฐ”๋กœ ์ถœ๋ ฅํ•˜๋ฉด ํ‡ด์‚ฌ์ผ(n์ผ)์˜ ์ตœ๋Œ€ ์ˆ˜์ต์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ 2์ค‘ for๋ฌธ์„ ๋Œ๊ฒŒ ๋˜๋ฉด 15486๋ฒˆ์—์„œ๋Š” ์‹œ๊ฐ„ ์ดˆ๊ฐ€๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค.

     

    ๐ŸŒฑ ํ’€์ด 2

    n = int(input())
    dp = [0] * (n + 1)
    meetings = [list(map(int, input().split())) for _ in range(n)]
    meetings.insert(0, [0, 0])
    
    # DP ํ’€์ด
    profit = 0
    for i in range(1, n + 1):
        end_date = i + meetings[i][0] - 1  # i์ผ์— ์‹œ์ž‘ํ•œ ์ƒ๋‹ด์ด ๋๋‚˜๋Š” ๋‚ 
        profit = max(profit, dp[i - 1])  # i์ผ๊นŒ์ง€์˜ ์ตœ๋Œ€ ์ˆ˜์ต
        if end_date <= n:  # ์ƒ๋‹ด์ด ๋๋‚˜๋Š” ๋‚ ์ด ํ‡ด์‚ฌ์ผ์„ ๋„˜์ง€ ์•Š์œผ๋ฉด
            # ์ ํ™”์‹ (ํ˜„์žฌ ์ €์žฅ๋œ ์ตœ๋Œ€ ์ˆ˜์ต๊ณผ i-1์ผ๊นŒ์ง€์˜ ์ตœ๋Œ€ ์ˆ˜์ต + i์ผ ์ƒ๋‹ด ์ˆ˜์ต์„ ๋น„๊ต)
            dp[end_date] = max(dp[end_date], profit+meetings[i][1])
    
    print(max(dp))
    • ํ’€์ด1๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ i์ผ์— ์‹œ์ž‘ํ•œ ์ƒ๋‹ด์ด ๋๋‚˜๋Š” ๋‚ ์˜ dp๋งŒ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. (ํ’€์ด1์—์„œ๋Š” ์ƒ๋‹ด์ด ๋๋‚˜๋Š” ๋‚ ๋ถ€ํ„ฐ ํ‡ด์‚ฌ์ผ๊นŒ์ง€ ๋๊นŒ์ง€ ์ˆœํšŒํ•˜๋„๋ก for๋ฌธ์„ ํ•œ ๋ฒˆ ๋” ์‚ฌ์šฉํ•จ)
    • ๋Œ€์‹ , i-1๊นŒ์ง€์˜ ์ตœ๋Œ€ ์ˆ˜์ต์„ ๋‹ด๊ณ  ์žˆ๋Š” profit ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ i-1์ผ๊นŒ์ง€์˜ ์ตœ๋Œ€ ์ˆ˜์ต์— i์ผ ์ƒ๋‹ด ์ˆ˜์ต์„ ๋”ํ•˜์—ฌ i์ผ์— ์‹œ์ž‘ํ•œ ์ƒ๋‹ด์ด ๋๋‚˜๋Š” ๋‚ ์˜ ์ตœ๋Œ€ ์ˆ˜์ต์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋”ฐ๋ผ์„œ dp[end_date]์˜ ๊ฐ’์€ ์ด๋ฏธ ์ €์žฅ๋˜์–ด์žˆ๋Š” dp[end_date]์™€ profit(i-1์ผ๊นŒ์ง€์˜ ์ตœ๋Œ€ ์ˆ˜์ต)+meetings[i][1](i์ผ์˜ ์ƒ๋‹ด ์ˆ˜์ต)์„ ๋น„๊ตํ•˜์—ฌ ๋” ํฐ ๊ฐ’์œผ๋กœ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์—๋Š” dp[n]์ด ์•„๋‹Œ max(dp)๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด for๋ฌธ์„ ํ•œ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ i์ผ์— ์‹œ์ž‘ํ•œ ์ƒ๋‹ด์ด ๋๋‚˜๋Š” ๋‚ ์˜ dp๊ฐ’๋งŒ ์—…๋ฐ์ดํŠธ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ, ๋งˆ์ง€๋ง‰ ๋‚ ์— ๋๋‚˜๋Š” ์ƒ๋‹ด์ด ์—†๋‹ค๋ฉด dp ๊ฐ’์ด ๊ฐฑ์‹ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ dp ๋ฐฐ์—ด์˜ ์ตœ๋Œ“๊ฐ’์„ printํ•˜์—ฌ ์ตœ๋Œ€ ์ˆ˜์ต์„ ์ถœ๋ ฅํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

     

    ๐ŸŒฑ ์ •๋‹ต ์ฝ”๋“œ

    # !/usr/bin/env python
    #  -*- coding: utf-8 -*-
    # boj 15486 ํ‡ด์‚ฌ2
    
    import sys
    
    input = sys.stdin.readline
    
    n = int(input())
    dp = [0] * (n + 1)
    meetings = [list(map(int, input().split())) for _ in range(n)]
    meetings.insert(0, [0, 0])
    
    # DP ํ’€์ด
    profit = 0
    for i in range(1, n + 1):
        end_date = i + meetings[i][0] - 1
        profit = max(profit, dp[i - 1])
        if end_date <= n:
            dp[end_date] = max(dp[end_date], profit+meetings[i][1])
    
    print(max(dp))
    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€