paranid5

15 10.11

Nov 10th, 2021
1,085
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 1.26 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. private val invalid2 = Triple(0, 1e9.toInt(), listOf<Int>())
  5.  
  6. private fun dfs(
  7.     tab: List<List<Int>>,
  8.     n: Int = 0,
  9.     m: Int,
  10.     dp: List<MutableList<Triple<Int, Int, List<Int>>>> = List(tab.size) { MutableList(tab.first().size) { invalid2 } }.also { list ->
  11.         (0..9).forEach { list[tab.size - 1][it] = Triple(tab[tab.size - 1][it], tab[tab.size - 1][it], listOf(it)) }
  12.     }
  13. ): Triple<Int, Int, List<Int>> {
  14.     if (n >= tab.size - 1 || m !in 0..9)
  15.         return invalid2
  16.  
  17.     if (dp[n][m] != invalid2)
  18.         return dp[n][m]
  19.  
  20.     dp[n][m] = run {
  21.         val f = dfs(tab, n + 1, m - 1, dp)
  22.         val s = dfs(tab, n + 1, m + 1, dp)
  23.         val t = dfs(tab, n + 1, m, dp)
  24.         arrayOf(f, s, t).minByOrNull { it.second }!!
  25.     }.let { (f, s, t) ->
  26.         val c = tab[n][m]
  27.         Triple(f + c, s + c, t + m)
  28.     }
  29.  
  30.     return dp[n][m]
  31. }
  32.  
  33. fun main() {
  34.     val list = (0..9).map { readLine()!!.trim().split("\t").map(String::toInt) }
  35.     (0..9).map { dfs(list, m = it) }.minByOrNull { it.second }!!.let { (_, _, l) ->
  36.         println("FIRST: ${list[list.size - 1][l.first()]} LAST: ${list[0][l.last()]}")
  37.     }
  38. }
Advertisement
Add Comment
Please, Sign In to add comment