โซ๏ธ ๋ฌธ์
https://www.acmicpc.net/problem/2579
โซ๏ธ ๋์ ์๊ฐ
์ฐ์ , ๋ง์ง๋ง ๊ณ๋จ์ ๊ผญ ๋ค๋ฌ์ผํ๋ค๊ณ ํ ์กฐ๊ฑด์ด ๋์ ๋ณด์๋ค. ๊ทธ๋ผ? ๊ฒฐ๊ตญ dp[๋ง์ง๋ง๊ณ๋จ]์ ์ถ๋ ฅํ์๋์ ์ต๋๊ฐ์ ๊ตฌํ๋ฉด ๋๊ฒ ๊ตฌ๋! ์๊ฐํ๋ค.
์ด์ ์ dp ์ ํ์ ์กฐ๊ธ ํ์ด๋ณธ์ ์ด ์์ด์ ์ด ๋ฌธ์ ๋ฅผ ๋ณด๊ณ dp๋ฐฐ์ด์ ์ด๋ค ๊ฒ์ ๋ฃ์ด์ฃผ์ด์ผํ๋์ง ๊ฐ์ด ์๋ค.
๋๋ dp๋ฅผ ์ด๋ ๊ฒ ์ ์ํ ๊ฒ์ด๋ค.
dp[i] = i๋ฒ์งธ ๊ณ๋จ๊น์ง ์ฌ๋ผ๊ฐ๋๋ฐ ์ต๋ ์ ์
์ด๋ ๊ฒ ์ ์๋ฅผ ํด๋๊ณ ๊ทธ๋ฆผ์ ๊ทธ๋ ค์ ์๊ฐํด๋ดค๋ค. ์ฐ์ , ์ฐ๋ฌ์์ ์ธ ์นธ์ ์ฐ๋ฆฌ๋ ๊ฐ ์ ์๋ค. ๊ทธ๋์ ์ง๊ธ ์๋ ์์น๋ก ์ฌ ์ ์๋ ๋ฐฉ์์ ๋ค์ ๋๊ฐ์ง์ ๊ฐ๋ค.
1. 3๋ฒ์งธ ์ ์นธ → ๋ฐ๋ก์์นธ → ํ์ฌ์์น
2. 2๋ฒ์งธ์ → ํ์ฌ์์น (๋๋ฒ์งธ ์ ์นธ์์ ์๊ธฐ ๋๋ฌธ์ ๊ทธ ์ ์ ์ด๋ป๊ฒ ์์ง์๋ ์๊ด์๋ค.)
์.. ๊ทธ๋ผ ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ์ต๋๊ฐ์ ์ด๋ป๊ฒ ๊ตฌํ ๊น? ์์์ dp์ ํด๋น ์นธ์๊น์ง ์ค๋๋ฐ ์ต๋๊ฐ์ ์ ์ฅํด๋์๋ค. ํ์ฌ์ ์นธ์๊น์ง ์ค๋๋ฐ ์ต๋๊ฐ์ ์ ์ฅํ๋ dp ํ ์ด๋ธ์ ์์๋ฌธ์ ๋ฅผ ํ๋์ฉ ํด๊ฒฐํด๊ฐ๋ฉด์ ์ต์ข ์๋ก ์ฌ๋ผ์ค๋ ๋ฐฉ์์ด๋ฏ๋ก dp ๋ฅผ ๊ตฌํํ๋ ๋๊ฐ์ง ๋ฐฉ์ ์ค bottom-up ์ํฅ์ ๋ฐฉ์์ผ๋ก ๋ณผ ์ ์๋ค. (๋ชจ๋ฅด๋ ์ฌ๋์ ์๋ ๋ ธ์ ๊ธ์ ์ฐธ๊ณ ํด๋ณด์. ๋๋๋น๋์ ๊ฐ์๋ฅผ ๋ณด๊ณ ์ ๋ฆฌํ ๋ด์ฉ์ด๋ค)
https://desert-opossum-095.notion.site/DP-8180a955db954132b9c70b05678cfa15
๋๋ ๊ฐ๊ฐ์ ๋๊ฐ์ง ๊ฒฝ์ฐ์ ์ ํ์์ ์ธ์ ๋ค. ๋๋ ๊ฒฐ๊ตญ ๊ทธ ์นธ์๊น์ง ์ค๋ '์ต๋'๊ฐ์ ๊ตฌํ๋ฉด ๋๊ธฐ ๋๋ฌธ์, ๋ ๊ฐ์ง ์ ํ์ ์ค, max ๊ฐ์ ์ ํํด์ dp ํ ์ด๋ธ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค. dp[i]๋ i๋ฒ์ฌ ์นธ์ ์ค๋ ์ต๋ ์ ์๋ง์ ์ทจ๊ธํ๊ธฐ ๋๋ฌธ์!
1. dp[i] = ์ ์[i] + ์ ์[i-1] + dp[i-3]
// ํด๋น์นธ ์ ์ + ํ์นธ ์ ์ ์ + 3์นธ์ ๊น์ง ์ค๋๋ฐ ์ต๋ ์ ์
2. dp[i] = ์ ์[i] + dp[i-2]
// ํด๋น์นธ ์ ์ + 2์นธ ์ ๋์ด๊น์ง ์ค๋๋ฐ ์ต๋ ์ ์
์ด๋ ๊ฒ ์ ํ์์ ๊ตฌํ ์ ์๋ค.
์ฌ๊ธฐ์, ํ๊ฐ์ง ๊ฑธ๋ฆฌ๋ ์ ์ด ์๋ค. ์ฐ๋ฆฌ๋ i-3๊น์ง ์ ํ์์ ๋ฃ์ด์ฃผ์ด์ผ ํ๋ฏ๋ก, i ๊ฐ 0, 1, 2, 3์ผ๋ ๋ฐ๋ก ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผํ๋ค. ์๊ฐ์ ํด๋ณด๋๊น, 1๋ฒ์งธ ๊ณ๋จ๊น์ง ์ฌ๋ผ์ค๋๋ฐ ์ต๋๊ฐ, 2๋ฒ์งธ ๊ณ๋จ๊น์ง ์ฌ๋ผ์ค๋๋ฐ ์ต๋๊ฐ, 3๋ฒ์งธ ๊ณ๋จ๊น์ง ์ฌ๋ผ์ค๋๋ฐ ์ต๋๊ฐ์ ์ ํด์ ธ์์๋ค.
์ด๋ ๊ฒ... ๊ทธ๋์ ์ด ๋ชจ๋ ๊ฒ๋ค์ dp์ ์์๋ก ๋ฃ์ด์ค๋ค. ์ด ๋ชจ๋ ๊ณผ์ ์ ์ฝ๋๋ก ๊ตฌํํ๋ฉด? ์ ๋ต!
โซ๏ธ ์ ๋ต์ฝ๋
import Foundation
let n = Int(readLine()!)!
var arr = [0]
for _ in 0..<n {
arr.append(Int(readLine()!)!)
}
var dp = Array(repeating: 0, count: 301)
func solution() -> Int {
if n == 1 {
return arr[1]
} else if n == 2 {
return arr[1] + arr[2]
} else if n == 3 {
return max(arr[1]+arr[3], arr[2]+arr[3])
} else {
dp[1] = arr[1]
dp[2] = arr[1] + arr[2]
dp[3] = max(arr[1]+arr[3], arr[2]+arr[3])
for i in 4...n {
dp[i] = max(arr[i]+arr[i-1]+dp[i-3], dp[i-2]+arr[i])
}
}
return dp[n]
}
print(solution())