๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/11052
๋ด๊ฐ ํผ ํ์ด - ๋ง์์ต๋๋ค!
- ์์ 1๋ฒ์ ํ์ฉํ์ฌ ์๊ฐํด๋ณด์.
- ์นด๋ ๊ฐ์ n, ์ ๋ ฅ๋๋ ๊ฐ ์นด๋ํฉ์ ๊ฐ๊ฒฉ์ ๋ฐฐ์ด p , ์นด๋ n ๊ฐ๋ฅผ ๊ตฌ๋งคํ ๋์ ์ต๋ ๊ธ์ก์ ๋ฐฐ์ด dp์ ๋ฃ์ ๊ฒ
- ์นด๋ 4๊ฐ, ๊ฐ๊ฒฉ p = [1, 5, 6, 7] ์ผ๋
- dp = [0, 0, 0, 0, 0] → ์ธ๋ฑ์ค ๊ฐ์ ๋ง์ถ๊ธฐ ์ํด์ n+1 ๊ฐ ๋งํผ dp๋ฅผ 0๋ฐฐ์ด๋ก ์ ์
์ด๋ ๊ฒ ์ ์ํ ๋ค, dp ๋ฐฐ์ด์ ์ด๋ป๊ฒ max ๊ฐ์ ๋ฃ์์ง ๊ณ ๋ฏผํด๋ณด์์ผ ํ๋ค.
์นด๋ 4๊ฐ๋ฅผ ๊ตฌ๋งคํ๋๋ฐ, ์ต๊ณ ๊ธ์ก์ ๊ตฌํด์ผํ๋ฉด
- ์นด๋ 3๊ฐ๋ฅผ ๊ตฌ๋งคํ๋ ์ต๋๊ฐ + 1๊ฐ์ง๋ฆฌ ์นด๋ํฉ ๊ตฌ๋งค
- ์นด๋ 3๊ฐ๋ฅผ ๊ตฌ๋งคํ๋ ๋ฐฉ๋ฒ์ 1, 1, 1 / 2, 1 / 3 ์ด๋ ๊ฒ ์ธ๊ฐ์ง ๊ฒ ์ง? ์ฐ๋ฆฌ๋ ์ด์ฐจํผ ์ต๋ ๊ธ์ก๋ง ํ์ํ๋๊น, ์ด ์ธ๊ฐ์ง ์ค ๊ฐ์ฅ max ๊ฐ๋ง ์ฐพ์ผ๋ฉด ๋๋ ๊ฑฐ์.
- ์นด๋ 2๊ฐ๋ฅผ ๊ตฌ๋งคํ๋ ์ต๋๊ฐ + 2๊ฐ์ง๋ฆฌ ์นด๋ํฉ ๊ตฌ๋งค
- ์นด๋ 1๊ฐ๋ฅผ ๊ตฌ๋งคํ๋ ์ต๋๊ฐ + 3๊ฐ์ง๋ฆฌ ์นด๋ํฉ ๊ตฌ๋งค
- ์นด๋ 0๊ฐ๋ฅผ ๊ตฌ๋งคํ๋ ์ต๋๊ฐ + 4๊ฐ์ง๋ฆฌ ์นด๋ํฉ ๊ตฌ๋งค
์ด๋ ๊ฒ ๋ค ๊ฐ์ง์ ๊ธ์ก์ค ์ต๊ณ ๊ธ์ก์ ์ฐพ์ผ๋ฉด ๋๋ค.
๊ทธ๋ผ ์ฌ๊ธฐ์, ์ ๋ค๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ง๊ณ ๋์ํ๋ฅผ ํด๋ณด์. dp์๋ค๊ฐ ์ต๋๊ฐ์ ๋ฃ๊ธฐ๋ก ํ์ผ๋๊น, ์๋์ ๊ฐ์ ๋์์ ๋์ถํด๋ผ ์ ์๋ค.
- dp[4-1] + p[1]
- dp[4-2] + p[2]
- dp[4-3] + p[3]
- dp[4-4] + p[4]
์ด ๋ค๊ฐ์ง์ค ์ต๋๊ฐ์ dp[4] ์ ๋ฃ์ผ๋ฉด ์ ๋ต์ด๋ค!!
์ฆ, dp[n] ์ ๊ตฌํ๊ธฐ ์ํด์๋ ์ด์ค for๋ฌธ์ ์ฌ์ฉํ์ฌ dp์ ๋ค์ด๊ฐ ๊ฐ๋ค์ ๊ตฌํด์ฃผ๋ฉด ๋๋ค. ์ด๋ฅผ ์ฝ๋๋ก ๊ตฌํํ ์์ค์ฝ๋๋ ์๋์ ๊ฐ๋ค.
let n = Int(readLine()!)!
let p = readLine()!.split(separator: " ").map { Int(String($0))! }
var dp = [Int](repeating: 0, count: n+1)
for i in 1..<n+1 {
for j in 1..<i+1 {
dp[i] = max(dp[i], dp[i-j]+p[j-1])
}
}
print(dp[n])
dp ๋ ์ด๋ ค์ด๊ฒ๊ฐ์๋ฐ ใ ์ ์ดํด๊ฐ ๋น ๋ฆฃ๋น ๋ฆฃ ํ๊ฒ ์๋ ๊น.. ๋ ๋ง์ ์ฐ์ต์ด ํ์ํ ๊ฒ๊ฐ๋ค. min ํ ๊ฒฝ์ฐ์ ์๋ฅผ ์ฐพ๋ ๋ฌธ์ ๋ฅผ ๋ ์ดํด๋ณด๊ณ , ํด๋น ๋ฌธ์ ์ฒ๋ผ max ๊ฐ์ ์ฐพ๋ ๋ฌธ์ ๋ ์ตํ๋์.