#include <bits/stdc++.h>
using
namespace
std;
vector<vector<
long
long
> > dp;
int
createPalindrome(
int
input,
bool
isOdd)
{
int
n = input;
int
palin = input;
if
(isOdd)
n /= 10;
while
(n > 0) {
palin = palin * 10 + (n % 10);
n /= 10;
}
return
palin;
}
vector<
int
> generatePalindromes(
int
N)
{
vector<
int
> palindromes;
int
number;
for
(
int
j = 0; j < 2; j++) {
int
i = 1;
while
((number = createPalindrome(i++, j)) <= N)
palindromes.push_back(number);
}
return
palindromes;
}
long
long
minimumSubsetSize(vector<
int
>& A,
int
i,
int
j,
int
N)
{
if
(!N)
return
0;
if
(i > j || A[i] > N)
return
INT_MAX;
if
(dp[i][N])
return
dp[i][N];
dp[i][N] = min(1 + minimumSubsetSize(A, i + 1, j,
N - A[i]),
minimumSubsetSize(A, i + 1, j, N));
return
dp[i][N];
}
int
minimumNoOfPalindromes(
int
N)
{
vector<
int
> palindromes = generatePalindromes(N);
sort(palindromes.begin(), palindromes.end());
dp = vector<vector<
long
long
> >(palindromes.size(),
vector<
long
long
>(N + 1, 0));
return
minimumSubsetSize(palindromes, 0,
palindromes.size() - 1, N);
}
int
main()
{
int
N = 65;
cout << minimumNoOfPalindromes(N);
return
0;
}