Advertisement
paranid5

16 10.11

Nov 10th, 2021
1,078
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 1.40 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>>,
  7.     n: Int = 0,
  8.     m: Int,
  9.     dp: List<MutableList<Pair<Int, Int>>> = List(tab.size) { MutableList(tab.first().size) { invalid } }.also { list ->
  10.         (0..19).forEach { list[tab.size - 1][it] = tab[tab.size - 1][it] to tab[tab.size - 1][it] }
  11.     }
  12. ): Pair<Int, Int> {
  13.     val bool1 = n >= tab.size
  14.     val bool2 = m !in 0..19
  15.     val bool3 = n == 3 && (m in 3..7 || m in 12..16)
  16.     val bool4 = n == 15 && m in 6..13
  17.     val bool5 = n in 8..11 && m in 9..10
  18.  
  19.     if (bool1 || bool2 || bool3 || bool4 || bool5)
  20.         return invalid
  21.  
  22.     if (dp[n][m] != invalid)
  23.         return dp[n][m]
  24.  
  25.     dp[n][m] = run {
  26.         val f = dfs(tab, n + 1, m - 1, dp)
  27.         val s = dfs(tab, n + 1, m + 1, dp)
  28.         val t = dfs(tab, n + 1, m, dp)
  29.         arrayOf(f.first, s.first, t.first).maxOrNull()!! to arrayOf(f.second, s.second, t.second).minOrNull()!!
  30.     }.let { (f, s) -> f + tab[n][m] to s + tab[n][m] }
  31.  
  32.     /*println()
  33.     dp.forEach { println(it) }*/
  34.     return dp[n][m]
  35. }
  36.  
  37. fun main() {
  38.     val list = (0..19).map { readLine()!!.trim().split("\t").map(String::toInt) }
  39.     (0..19).map { dfs(list, m = it) }.flatMap { (f, s) -> listOf(f, s) }.let {
  40.         println("MAX: ${it.maxOrNull()!!} MIN: ${it.minOrNull()!!}")
  41.     }
  42. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement