Number Screw

 

#include <bits/stdc++.h>
#define M 10000

using namespace std;

int n;
int t[M+5][10];
int from[M+5];
int res[M+5];
int dir[M+5][10];
int C[M+5][10];

int pro(int idx, int n, int turn) {
    if(idx==n) return 0;
    int& ret = t[idx][turn];
    if(ret != -1) return ret;
    int cur=(from[idx] + turn)%10;
    int LT=(res[idx]-cur+10)%10;
    int LC=pro(idx+1,n,(turn+LT)%10)+LT;
    int RT=(cur-res[idx] + 10) % 10;
    int RC=pro(idx+1,n,turn)+RT;
    if (RC>LC){
        ret=LC;
        dir[idx][turn]=1;
        C[idx][turn]=LT;
    }else {
        ret=RC;
        dir[idx][turn]=-1;
        C[idx][turn]=RT;
    }
    return ret;
}

void print(int idx, int n, int turn) {
    if (idx == n) return;
    int _move = dir[idx][turn] * C[idx][turn];
    if (_move != 0){
        printf("%d %d\n", idx + 1, _move);
    }
    if (dir[idx][turn] > 0){
        print(idx + 1, n, (turn + _move + 10) % 10);
    }else{
        print(idx + 1, n, turn);
    }
}

int main() {
    //freopen("in.txt","r",stdin);
    cin>>n;
    for (int i=0;i<n;i++){
        scanf("%1d", &from[i]);
    }
    for (int i=0;i<n;i++){
        scanf("%1d", &res[i]);
    }
    memset(t, -1, sizeof(t));
    printf("%d\n", pro(0,n,0));
    print(0, n, 0);
    return 0;
}

Comments