๋ฌธ์ ์๊ฐ
๐ฅ๏ธ ๋ฌธ์ ๋ ๋ฒจ : ๊ณจ๋5
๐ ๋ฌธ์ ์ ํ : ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
๐ฌ ํ์ด ์ธ์ด : Kotlin
๐๏ธ ๋ฌธ์ ๋งํฌ : ๋ฐฑ์ค ๋ฌธ์ ๋งํฌ
๐ ๋ฌธ์
โi์ด์ A_i์ ์ ์๋ฅผ ์ป๋ ๊ฒ์์ด ์๋ค. N์ด ๋์ ์งํํ๋ ์ด ๊ฒ์์์๋ ์ ์๋ฅผ ์ถ๊ฐ๋ก ์ป๊ธฐ ์ํด T์ด์ ์ค์์น๋ฅผ ๋๋ฌ T,T+1,T+2์ด์ ์ป๋ ์ ์๋ฅผ 2๋ฐฐ๋ก ๋ง๋ค ์ ์๋ค. T์ด์ ์ค์์น๋ฅผ ๋๋ฅด๋ฉด T+3์ด๋ถํฐ ๋ค์ ์ค์์น๋ฅผ ๋๋ฅผ ์ ์๋ค.
๊ฒ์์ด ์งํ๋๋ ๋์ ์ค์์น๋ฅผ ์ ์ ํ๊ฒ ๋๋ ์ ๋ ์ป์ ์ ์๋ ์ ์์ ์ต๋๊ฐ์ ๊ตฌํด๋ณด์.
๐ค ๋ฌธ์ ๋ถ์
DP๋ฅผ ์ฌ์ฉํ๋ ๋ฌธ์ ๊ธฐ ๋๋ฌธ์, ์ ํ์์ ๋จผ์ ๊ตฌํด์ผ ํ๋ค. ์ฐ์ ๋ฌธ์ ์ ๋์์๋ฏ์ด, ์ค์์น๋ฅผ ๋๋ฅด๋ ์ ํ์ง์ ๋๋ฅด์ง ์๋ ์ ํ์ง๊ฐ ์กด์ฌํ๋ค. ์ด ๋, ๋งจ ์์์๋ถํฐ ์ ๊ทผํ ๊ฒฝ์ฐ, ์ด์ ์ ๋ฒํผ์ ๋๋ ๋์ง์ ๋ํ ์ฌ๋ถ๋ฅผ ํ๋จํด์ผํ๊ธฐ ๋๋ฌธ์ ๋ณต์กํด์ง ์ ์๋ค. ๋๋ฌธ์ ๋ค์์๋ถํฐ ์ ๊ทผ์ ํด๋ดค๋ค.
์ ํ์
์ฐ์ , dp[i]๋ i์ด๋ถํฐ ๊ฒ์์ด ๋๋ ๋๊น์ง ์ป์ ์ ์๋ ์ต๋ ์ ์๋ฅผ ์๋ฏธํ๋ค. ์ฆ, ํ์ด ์ฝ๋๋ ๋ค๋ถํฐ ์ ๊ทผ์ ํ๊ธฐ ๋๋ฌธ์ dp[0]์ด ์ ๋ต์ด ๋๋ ๊ฒ์ด๋ค.
i์ด์์ ๊ฐ๋ฅํ ์ ํ์ง๋ ๋ ๊ฐ์ง ๋ฟ์ด๋ค.
์ค์์น๋ฅผ ๋๋ฅด์ง ์๋ ๊ฒฝ์ฐ
i์ด์ ์ ์scores[i]๋ฅผ ๊ทธ๋๋ก ์ป๋๋ค.- ๋ค์ ์ํ :
dp[i + 1]
์ค์์น๋ฅผ ๋๋ฅธ ๊ฒฝ์ฐ
i, i + 1, i + 2์ด ์ ์ 2๋ฐฐ ์ด๋ฒคํธ- ๋ค์ ์ํ :
dp[i + 3]
์ฆ, ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด๋ค.
dp[i] = max(
dp[i + 1] + scores[i],
dp[i + 3] + 2 * (scores[i] + scores[i + 1] + scores[i + 2])
)
์ด์ , ์ด๋ฅผ n - 1์์ 0๊น์ง ์ญ์์ผ๋ก ๊ณ์ฐํ๋ฉด ์ ๋ต์ ์ป์ ์ ์๋ค.
for (i in n - 1 downTo 0) {
dp[i] = max(
dp[i + 1] + scores[i],
dp[i + 3] + 2 * (scores[i] + scores[i + 1] + scores[i + 2])
)
}
์๋ฎฌ๋ ์ด์
๋ค์ ์์ ๋ฅผ ํตํด ์๋ฎฌ๋ ์ด์ ์ ๋๋ ค๋ณด์.
5
-1 -2 -3 4 5
dp = [0, 0, 0, 0, 0, 0, 0, 0]
scores = [-1, -2, -3, 4, 5, 0, 0, 0]
i = 4dp[5] + scores[4]- = 0 + 5 → 5
dp[7] + (scores[4] + scores[5] + scores[6]) * 2)- = 0 + 2 * (5 + 0 + 0) → 10
dp = [0, 0, 0, 0, 10, 0, 0, 0]
i = 3dp[4] + scores[3]- = 10 + 4 → 14
dp[6] + (scores[3] + scores[4] + scores[5]) * 2)- = 0 + 2 * (4 + 5 + 0) → 18
dp = [0, 0, 0, 18, 10, 0, 0, 0]
i = 2dp[3] + scores[2]- = 18 + -3 → 15
dp[5] + (scores[2] + scores[3] + scores[4]) * 2)- = 0 + 2 * (-3 + 4 + 5) → 12
dp = [0, 0, 15, 18, 10, 0, 0, 0]
i = 1dp[2] + scores[1]- = 15 + -2 → 13
dp[4] + (scores[1] + scores[2] + scores[3]) * 2)- = 10 + 2 * (-2 + -3 + 4) → 8
dp = [0, 13, 15, 18, 10, 0, 0, 0]
i = 0dp[1] + scores[0]- = 13 + -1 → 12
dp[3] + (scores[0] + scores[1] + scores[2]) * 2)- = 18 + 2 * (-1 + -2 + -3) → 6
dp = [12, 13, 15, 18, 10, 0, 0, 0]
์ ๋ต : 12
๐ ์ต์ข ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 36152 KB
์๊ฐ : 300 ms
import java.util.StringTokenizer
import kotlin.math.max
fun main() = with(System.`in`.bufferedReader()) {
val n = readLine().toInt()
val st = StringTokenizer(readLine())
val scores = IntArray(n + 3) { 0 }
repeat(n) {
datum[it] = st.nextToken().toInt()
}
val dp = Array(n + 3) { 0 }
for (i in n - 1 downTo 0) {
dp[i] = max(
(dp[i + 1] + scores[i]),
(dp[i + 3] + (scores[i] + scores[i + 1] + scores[i + 2]) * 2)
)
}
println(dp[0])
}'PS > DP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [๋ฐฑ์ค][JAVA] - 1, 2, 3 ๋ํ๊ธฐ(9095) (2) | 2023.10.26 |
|---|