문제
https://www.acmicpc.net/problem/15486
입력
n: Int = 남은 근무 일
t: [Int] = 근무 시간
p: [Int] = 일급
1 <= n < 1,500,000
결과
ans: Int = 퇴사할 때 최대 수익
해석
점화식은 문제에서 금방 구할 수 있다.
dp[i] = i 날까지 왔을 때 최대 수익
j = i + t[i] = 다시 일을 할 수 있는 날 , i = 1이고, t[i] = 1이면 , 다음일은 2일부터 바로 시작할 수 있다.
하지만 여기서 중요한 점은 일을 많이한다고 수익이 최대가 아니다.
그러므로 현재 i날을 기준으로 전날 까지의 최댓값을 계속 가져가야한다.
코드
import Foundation
var t: [Int] = [0]
var p: [Int] = [0]
let n = Int(readLine()!)!
for _ in 0..<n {
let input = readLine()!.split{$0 == " "}.map{Int($0)!}
t.append(input[0])
p.append(input[1])
}
var dp: [Int] = [Int](repeating: 0, count: n+1)
for i in 1...n {
dp[i] = max(dp[i-1], dp[i])// 전날 까지의 최댓값
let time = t[i]
let pay = p[i]
let j = i + time-1 // 시작일도 포함이므로 -1
if j > n { continue }
dp[j] = max(dp[j], dp[i-1] + pay) // 전날 최대값 + 오늘 일
}
print(dp[n])
'PS > 백준' 카테고리의 다른 글
[백준] 3273 두 수의 합 (0) | 2024.10.14 |
---|---|
[백준] 1202 보석 도둑 (0) | 2024.10.14 |
[백준] 11722 가장 긴 감소하는 부분 수열 (0) | 2024.10.13 |
[백준] 1520 내리막 길 (1) | 2024.10.11 |
[백준] 2294 동전 2 (1) | 2024.10.10 |