解説
ダイヤルの動かし方をこのまま考えようとしても大変なので、まずは S の数値を工夫してみます。簡単のため、一旦 +1 の操作のみに着目し、0と9の繋がりを排除して考えます。
ここで例えば、S=1234のとき、左側の桁からの数字の増分をとった数列(左側から1桁目の部分は0からの増分)を考えると、 S′=(+1,+1,+1,+1) となります。この数値の意味を考えてみましょう。すると、si′>0 のとき Si′=si′ ということは、000..000 の左側から i 番目の桁から一番右の桁までに対して +1 するという操作を si′ 回 行った、と言い換えることができます。
次に、S=4321のときを考えてみます。左側の桁から数字の増分をとった数列を考えると、 S′=(+4,−1,−1,−1) となります。si′<0 のときも先程と同様に、0000 の左側から i 番目の桁から一番右の桁までに対して −1 するという操作を ∣si′∣ 回 行った、と言い換えることができます。
ここで、例として左側から4桁目の部分に着目してみます。左側から4桁目の部分は、i=1のときの操作で4回 +1 された後、i=2,3,4のときの操作で3回 −1 されていますが、これはi=1のときの操作で1回 +1 されただけであるとみなすことができます。同様に、左側から2,3桁目の部分もi=1のときの操作でそれぞれ3,2回 +1 されただけであるとみなすことができます。
これらの考えは、imos法のような考え方で次のようにまとめられます。
- +1 の操作のみで k回操作が行われて000..000 から Sとなるとき、i(1≤i≤k)番目の操作で li番目からri−1番目までの桁が +1 されるならば、それぞれのiについて sli′ は +1 , sri′ は −1 される。(ただしri=N+1 ならば −1 は無視される。)
この考え方より、+1 の操作回数はN個の0の数列(0,0,...,0)に対してl,r(1≤l<r≤N+1)番目の要素にそれぞれ +1 , −1 する操作をしてS′にするための最小の操作回数を求めれば良いと分かります。これは左側の要素から l として貪欲に操作を行えば求めることができます。<br>
例えば、S=4321のときは
(0,0,0,0)→(1,−1,0,0)→(2,−1,−1,0)→(3,−1,−1,−1)→(4,−1,−1,−1)と操作を行えばよいです。
−1 の操作についても、0と9の繋がりを考慮したとしても、左側の桁からの数字の増分(-1の操作のときときは減分)をとって同様に考えればよいです。これらの操作が混在しているパターンもあります。例として、S=9191のときを考えてみましょう。左側の桁からの数字の増分をとった数列(左側から1桁目の部分は0からの増分)を考えると、 S′=(−1,+2,−2,+2)となります。このような場合も、<br>
(0,0,0,0)→(−1,+1,0,0)→(−1,+2,−1,0)→(−1,+2,−2,+1)→(−1,+2,−2,+2)といったように左側の要素から l として貪欲に操作を行えば求めることができます。
さて、解法まであと一歩です。ここまで、左側の桁からの数字の増分をとった数列 S′ を例示のために分かりやすいよう定めていました。
しかし、実は S′ は無数に考えられます。例えば、S=123のとき、S′ は (+1,+1,+1)の他に(+1,+1,−9),(+1,−9,+1),(+1,−9,−9)などが考えられます。これは、0と9が繋がっているので、ダイヤルが一周(10回の操作)することでもともとの位置に戻ってくるからです。
ではどうすればいいのでしょうか?ここでは、各iについて、 −9≤si′≤9 となるような si′ を全探索すればよいです。∣si′∣>9 となる場合、ダイヤルが一周(10回の操作)していることになり、余分な操作をしていることになるからです。ここで、−9≤si′≤9 となるような si′ は各iについて (si−si−1)%10,−(si−1−si)%10の2通りが考えられるため、これらの組み合わせを全探索することになります。時間計算量は全探索の部分がO(2N)、各S′における最小の操作回数を求める部分が適切に実装できてO(N)となり、全体でO(2N×N)となるので、今回の制約においては実行時間制限に間に合います。よって、この問題を解くことができました。