Advertisement
paranid5

7 13.11

Nov 13th, 2021
1,059
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 1.64 KB | None | 0 0
  1. import java.io.File
  2.  
  3. private infix fun Boolean.arrow(other: Boolean) = !(this && !other)
  4.  
  5. private val invalid = 0 to 1e9.toInt() // max / min
  6.  
  7. private fun dfs(
  8.     tab: List<List<Int>> = (0..14).map { readLine()!!.trim().split("\t").map(String::toInt) },
  9.     n: Int = 0,
  10.     m: Int = 0,
  11.     dp: List<MutableList<Pair<Int, Int>>> = List(tab.size) { MutableList(tab.first().size) { invalid } }.also { list ->
  12.         list[tab.size - 1][tab.size - 1] = tab[tab.size - 1][tab.size - 1] to tab[tab.size - 1][tab.size - 1]
  13.     }
  14. ): Pair<Int, Int> {
  15.     val bool1 = n >= tab.size
  16.     val bool2 = m >= tab.size
  17.  
  18.     if (bool1 || bool2)
  19.         return invalid
  20.  
  21.     if (dp[n][m] != invalid)
  22.         return dp[n][m]
  23.  
  24.     dp[n][m] = run {
  25.         val f = dfs(tab, n + 1, m, dp).takeIf { it != invalid }?.let { (f, s) ->
  26.             when {
  27.                 tab[n + 1][m] > tab[n][m] -> (f - tab[n][m]) to (s - tab[n][m])
  28.                 else -> (f + tab[n][m]) to (s + tab[n][m])
  29.             }
  30.         } ?: invalid
  31.  
  32.         val s = dfs(tab, n, m + 1, dp).takeIf { it != invalid }?.let { (f, s) ->
  33.             when {
  34.                 tab[n][m + 1] > tab[n][m] -> (f - tab[n][m]) to (s - tab[n][m])
  35.                 else -> (f + tab[n][m]) to (s + tab[n][m])
  36.             }
  37.         } ?: invalid
  38.  
  39.         arrayOf(f.first, s.first).maxOrNull()!! to arrayOf(f.second, s.second).minOrNull()!!
  40.     }
  41.  
  42.     return dp[n][m]
  43. }
  44.  
  45. private inline val Iterable<String>.concated
  46.     get() = reduce { acc, s -> "$acc$s" }
  47.  
  48. fun main() = print(
  49.     File("24-s1.txt")
  50.         .readLines()
  51.         .concated
  52.         .split("A[A-Z]R".toRegex())
  53.         .size - 1
  54. )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement