[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))
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€