Advertisement
paranid5

17 10.11

Nov 10th, 2021
1,123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 1.45 KB | None | 0 0
  1. private infix fun Boolean.arrow(other: Boolean) = !(this && !other)
  2.  
  3. private val invalid = 0 to 1e9.toInt() // max / min
  4.  
  5. private fun dfs(
  6.     tab: List<List<Int>> = (0..14).map { readLine()!!.trim().split("\t").map(String::toInt) },
  7.     n: Int = 0,
  8.     m: Int = 0,
  9.     dp: List<MutableList<Pair<Int, Int>>> = List(tab.size) { MutableList(tab.first().size) { invalid } }.also { list ->
  10.         list[tab.size - 1][tab.size - 1] = tab[tab.size - 1][tab.size - 1] to tab[tab.size - 1][tab.size - 1]
  11.     }
  12. ): Pair<Int, Int> {
  13.     val bool1 = n >= tab.size
  14.     val bool2 = m >= tab.size
  15.  
  16.     if (bool1 || bool2)
  17.         return invalid
  18.  
  19.     if (dp[n][m] != invalid)
  20.         return dp[n][m]
  21.  
  22.     dp[n][m] = run {
  23.         val f = dfs(tab, n + 1, m, dp).takeIf { it != invalid }?.let { (f, s) ->
  24.             when {
  25.                 tab[n + 1][m] > tab[n][m] -> (f - tab[n][m]) to (s - tab[n][m])
  26.                 else -> (f + tab[n][m]) to (s + tab[n][m])
  27.             }
  28.         } ?: invalid
  29.  
  30.         val s = dfs(tab, n, m + 1, dp).takeIf { it != invalid }?.let { (f, s) ->
  31.             when {
  32.                 tab[n][m + 1] > tab[n][m] -> (f - tab[n][m]) to (s - tab[n][m])
  33.                 else -> (f + tab[n][m]) to (s + tab[n][m])
  34.             }
  35.         } ?: invalid
  36.  
  37.         arrayOf(f.first, s.first).maxOrNull()!! to arrayOf(f.second, s.second).minOrNull()!!
  38.     }
  39.  
  40.     return dp[n][m]
  41. }
  42.  
  43. fun main() = dfs().let { (f, s) -> println("MAX: $f MIN: $s") }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement