Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], skipTags: ["script","noscript","style","textarea","code"], processEscapes: true }});

問題文

2つの整数 $A$，$B$ がある。
十進数での筆算によって $A - B$ を求める処理を以下に示す。

　1. $A$，$B$ を十進数で表現する。添字は下位から順に $0,1,2,...,n-1$ とし、 $A = A_{n-1} A_{n-2} ... A_{0}$，$B = B_{n-1} B_{n-2} ... B_{0}$ とする。 $n$ は十進数で表現した時の$A$の桁数とする。 $B$ の桁数が $n$ より小さいとき、上位桁に $0$ を補う。

　2. $borrow_{0} = 0$ とする。

　3. 以下の処理を $i = 0$ から $n-1$ まで繰り返す。

　　3.1. $A_{i} - borrow_{i} \geq B_{i}$ ならば、 $C_{i} = A_{i} - borrow_{i} - B_{i}$ ， $borrow_{i+1} = 0$とする。

　　3.2. $A_{i} - borrow_{i} \lt B_{i}$ ならば、 $C_{i} = A_{i} - borrow_{i} + 10 - B_{i}$ ， $borrow_{i+1} = 1$とする。

$A - B$ の計算結果は $C_{n-1} C_{n-2} ... C_{0}$ となる。ただし、最上位に連続する $0$ は取り除く。

繰り下がりを忘れると3.2の処理での $borrow_{i+1} = 1$ が $borrow_{i+1} = 0$ となる。
最大 $K$ 回繰り下がりを忘れたときの計算結果の最大値を求めよ。

入力

入力は以下の形式に従う。与えられる数は全て整数である。

$A$ $B$ $K$

制約

$1 \leq B \lt A \leq 10^9$

$1 \leq K \leq 9$

出力

計算結果の最大値を1行に出力せよ。

Sample Input 1

99 98 1

Output for the Sample Input 1

1

Sample Input 2

100 2 3

Output for the Sample Input 2

198

Sample Input 3

538 84 1

Output for the Sample Input 3

554

Sample Input 4

2012 1987 1

Output for the Sample Input 4

1025

Solution in Kotlin (judge verdict: Accepted)

fun main(args:Array<String>?): Unit {
    val (a, b, k) = readLine()!!.trim().split(' ').map(String::toInt)
    println(solve(a, b, k))
}
fun solve(a: Int, b: Int, k: Int): Int {
    val aDigits = (10000000000L + a).toString().drop(1).map{it - '0'}.toIntArray()
    val bDigits = (10000000000L + b).toString().drop(1).map{it - '0'}.toIntArray()
    val memo = Array(2){Array(k + 1){Array(aDigits.size){null as Int?}}}
    fun sub(digit: Int, restK: Int, borrow: Int = 0): Int {
        if (digit < 0) return 0
        if (memo[borrow][restK][digit] != null) return memo[borrow][restK][digit]!!
        val d = aDigits[digit] - bDigits[digit] - borrow
        var max = sub(digit - 1, restK, if (d < 0) 1 else 0) * 10 + (10 + d) % 10
        if (restK > 0) {
            val s = sub(digit - 1, restK - 1, 0) * 10 + (10 + d) % 10
            if (max < s) max = s
        }
        memo[borrow][restK][digit] = max
        return max
    }
    return sub(aDigits.lastIndex, k)
}