Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.File
- private infix fun Boolean.arrow(other: Boolean) = !(this && !other)
- private val invalid = 0 to 1e9.toInt() // max / min
- private fun dfs(
- tab: List<List<Int>> = (0..14).map { readLine()!!.trim().split("\t").map(String::toInt) },
- n: Int = 0,
- m: Int = 0,
- dp: List<MutableList<Pair<Int, Int>>> = List(tab.size) { MutableList(tab.first().size) { invalid } }.also { list ->
- list[tab.size - 1][tab.size - 1] = tab[tab.size - 1][tab.size - 1] to tab[tab.size - 1][tab.size - 1]
- }
- ): Pair<Int, Int> {
- val bool1 = n >= tab.size
- val bool2 = m >= tab.size
- if (bool1 || bool2)
- return invalid
- if (dp[n][m] != invalid)
- return dp[n][m]
- dp[n][m] = run {
- val f = dfs(tab, n + 1, m, dp).takeIf { it != invalid }?.let { (f, s) ->
- when {
- tab[n + 1][m] > tab[n][m] -> (f - tab[n][m]) to (s - tab[n][m])
- else -> (f + tab[n][m]) to (s + tab[n][m])
- }
- } ?: invalid
- val s = dfs(tab, n, m + 1, dp).takeIf { it != invalid }?.let { (f, s) ->
- when {
- tab[n][m + 1] > tab[n][m] -> (f - tab[n][m]) to (s - tab[n][m])
- else -> (f + tab[n][m]) to (s + tab[n][m])
- }
- } ?: invalid
- arrayOf(f.first, s.first).maxOrNull()!! to arrayOf(f.second, s.second).minOrNull()!!
- }
- return dp[n][m]
- }
- private inline val Iterable<String>.concated
- get() = reduce { acc, s -> "$acc$s" }
- fun main() = print(
- File("24-s1.txt")
- .readLines()
- .concated
- .split("A[A-Z]R".toRegex())
- .size - 1
- )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement