#include <bits/stdc++.h>   using namespace std;   const int MAX_LN = 20;   const int D = 10;   const long long INF = 1LL << 60;   const double EPS = 1e-9;   const double PI = 3.14159265358979;   long long n;   long long dp[MAX_LN][1 << D][D][D];   long long pat[2][D];   void init(int S, int v0) {     long long sdp[20];     fill(sdp, sdp + 20, INF);     sdp[10 + v0] = 0;     sdp[10] = min(sdp[10], 1LL);     for (int i = (0); i < (D); i++)       if (S & (1 << i)) {         for (int j = (10 - i); j < (20 - i); j++) {           sdp[j] = min(sdp[j], sdp[j + i] + 1);         }       }     for (int i = (0); i < (D); i++) dp[0][S][v0][i] = sdp[i];   }   void calc(int d, int S) {     long long sdp[2][D];     long long *curr = sdp[0], *next = sdp[1];     for (int s = (0); s < (D); s++) {       for (int i = (0); i < (2); i++)         for (int j = (0); j < (D); j++) sdp[i][j] = INF;       curr[s] = 0;       if (d > 0) {         {           for (int j = (0); j < (D); j++) next[j] = INF;           for (int j = (0); j < (D); j++)             for (int k = (0); k < (D); k++) {               next[k] = min(next[k], curr[j] + dp[d][S | (1 << 9)][j][k]);             }           swap(curr, next);         }         for (int i = 9; i >= 1; i--) {           {             for (int j = (0); j < (D); j++) next[j] = INF;             for (int j = (0); j < (D); j++)               for (int k = (0); k < (D); k++) {                 next[k] = min(next[k], curr[j] + dp[0][S | (1 << i)][j][k]);               }             swap(curr, next);           }           {             for (int j = (0); j < (D); j++) next[j] = INF;             for (int j = (0); j < (D); j++)               for (int k = (0); k < (D); k++) {                 next[k] = min(next[k], curr[j] + dp[d][S | (1 << (i - 1))][j][k]);               }             swap(curr, next);           }         }       } else {         for (int i = 9; i >= 1; i--) {           for (int j = (0); j < (D); j++) next[j] = INF;           for (int j = (0); j < (D); j++)             for (int k = (0); k < (D); k++) {               next[k] = min(next[k], curr[j] + dp[0][S | (1 << i)][j][k]);             }           swap(curr, next);         }       }       for (int i = (0); i < (D); i++) dp[d + 1][S][s][i] = curr[i];     }   }   int main() {     cin >> n;     if (n == 0) {       cout << 0 << endl;       return 0;     }     int m = 0;     long long t = n;     while (t > 0) {       t /= 10;       m++;     }     for (int i = (0); i < (m - 1); i++)       for (int j = (0); j < (D); j++)         for (int k = (0); k < (D); k++)           for (int l = (0); l < (D + 1); l++) dp[i][j][k][l] = INF;     for (int i = (0); i < (1 << D); i++)       for (int j = (0); j < (D); j++) {         init(i, j);       }     for (int i = (0); i < (m - 2); i++) {       for (int S = (0); S < (1 << D); S++) {         calc(i, S);       }     }     long long *curr = pat[0], *next = pat[1];     for (int i = (0); i < (D); i++) {       curr[i] = (n % 10 == i) ? 0 : INF;     }     for (int i = (0); i < (m - 1); i++) {       n /= 10;       int S = 0;       int mod = n % 10;       long long t = n / 10;       while (t > 0) {         S |= (1 << (t % 10));         t /= 10;       }       if (i > 0) {         for (int j = mod; j >= 1; j--) {           {             for (int k = (0); k < (D); k++) next[k] = INF;             for (int k = (0); k < (D); k++)               for (int l = (0); l < (D); l++) {                 next[l] = min(next[l], curr[k] + dp[0][S | (1 << j)][k][l]);               }             swap(curr, next);           }           {             for (int k = (0); k < (D); k++) next[k] = INF;             for (int k = (0); k < (D); k++)               for (int l = (0); l < (D); l++) {                 next[l] = min(next[l], curr[k] + dp[i][S | (1 << (j - 1))][k][l]);               }             swap(curr, next);           }         }       } else {         for (int j = mod; j >= 1; j--) {           for (int k = (0); k < (D); k++) next[k] = INF;           for (int k = (0); k < (D); k++)             for (int l = (0); l < (D); l++) {               next[l] = min(next[l], curr[k] + dp[i][S | (1 << j)][k][l]);             }           swap(curr, next);         }       }     }     cout << *min_element(curr, curr + D) + 1 << endl;     return 0;   }