https://coderun.yandex.ru/problem/book-shelf Средняя

Решение

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import kotlin.math.max

fun main() {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))

    val n = reader.readLine().toInt()
    val heights = reader.readLine().split(" ").map { it.toInt() }

    val H = 100
    val SENTINEL_R = H + 1
    var dp = Array(H + 1) { IntArray(H + 2) { -1 } }
    dp[0][SENTINEL_R] = 0

    for (h in heights) {
        val newDp = Array(H + 1) { IntArray(H + 2) { -1 } }
        for (l in 0..H) {
            for (r in 1..SENTINEL_R) {
                if (dp[l][r] == -1) continue
                val k = dp[l][r]
                newDp[l][r] = max(newDp[l][r], k)
                if (h >= l && (r == SENTINEL_R || h <= r)) {
                    newDp[h][r] = max(newDp[h][r], k + 1)
                }
                if (h <= r && (l == 0 || h >= l)) {
                    newDp[l][h] = max(newDp[l][h], k + 1)
                }
            }
        }
        dp = newDp
    }

    var maxBooks = 0
    for (l in 0..H) {
        for (r in 1..SENTINEL_R) {
            maxBooks = max(maxBooks, dp[l][r])
        }
    }

    writer.write(maxBooks.toString())
    writer.newLine()
    writer.flush()
}