using
System;
class
GFG{
static
int
[,,,]dp =
new
int
[1002, 10, 2, 2];
static
int
possibleNumbers(
int
pos,
int
previous,
int
tight,
int
start,
String N,
int
K)
{
if
(pos == N.Length)
return
1;
if
(dp[pos, previous, tight, start] != -1)
return
dp[pos, previous, tight, start];
int
res = 0;
int
upper_limit = (tight == 1) ?
(N[pos] -
'0'
) : 9;
int
new_tight;
if
(start == 0)
{
res = possibleNumbers(pos + 1, previous,
0, 0, N, K);
for
(
int
i = 1; i <= upper_limit; i++)
{
new_tight = (tight > 0 &&
i == upper_limit) ? 1 : 0;
res += possibleNumbers(pos + 1, i,
new_tight,
1, N, K);
}
}
else
{
for
(
int
i = 0; i <= upper_limit; i++)
{
new_tight = (tight > 0 &&
i == upper_limit) ? 1 : 0;
if
(Math.Abs(i - previous) <= K)
res += possibleNumbers(pos + 1, i,
new_tight, 1,
N, K);
}
}
dp[pos, previous, tight, start] = res;
return
dp[pos, previous, tight, start];
}
public
static
void
Main(String[] args)
{
String N =
"20"
;
int
K = 2;
for
(
int
i = 0; i < 1002; i++)
for
(
int
j = 0; j < 10; j++)
for
(
int
k = 0; k < 2; k++)
for
(
int
l = 0; l < 2; l++)
dp[i, j, k, l] = -1;
Console.Write(possibleNumbers(0, 0, 1, 0,
N, K) +
"\n"
);
}
}