给定n,找到n位步进数的计数。如果所有相邻数字的绝对差为1,则该数字称为步进数。321是步进数,而421不是。
例子:
Input : 2
Output : 17
The numbers are 10, 12, 21,
23, 32, 34, 43, 45, 54, 56, 65, 67, 76,
78, 87, 89, 98.
Input : 1
Output : 10
The numbers are 0, 1, 2, 3,
4, 5, 6, 7, 8, 9.
在上一篇文章中,讨论了需要O(n)辅助空间的解决方案。解决问题所需的辅助空间可以得到优化。二维dp数组dp [i] [j]表示长度i和最后一位j的步进数的计数。对于数字j,从数字j – 1和j + 1获得计数。递归关系为dp [i] [j] = dp [i-1] [j-1] + dp [i-1] [j +1] 。请注意,当前长度i的答案仅取决于i –1。因此,可以使用一维dp数组,其中对于给定的i,dp [j]存储长度为i的以数字j结尾的步进数的计数。在将dp数组更新为给定长度i之前,将长度为i – 1的结果存储在另一个数组prev中,然后使用prev数组更新dp数组。
下面是上述方法的实现:
C++
// CPP program to calculate the number of
// n digit stepping numbers.
#include
using namespace std;
// function that calculates the answer
long long answer(int n)
{
// dp[j] stores count of i digit
// stepping numbers ending with digit
// j.
int dp[10];
// To store result of length i - 1
// before updating dp[j] for length i.
int prev[10];
// if n is 1 then answer will be 10.
if (n == 1)
return 10;
// Initialize values for count of
// digits equal to 1.
for (int j = 0; j <= 9; j++)
dp[j] = 1;
// Compute values for count of digits
// more than 1.
for (int i = 2; i <= n; i++) {
for (int j = 0; j <= 9; j++) {
prev[j] = dp[j];
}
for (int j = 0; j <= 9; j++) {
// If ending digit is 0
if (j == 0)
dp[j] = prev[j + 1];
// If ending digit is 9
else if (j == 9)
dp[j] = prev[j - 1];
// For other digits.
else
dp[j] = prev[j - 1] + prev[j + 1];
}
}
// stores the final answer
long long sum = 0;
for (int j = 1; j <= 9; j++)
sum += dp[j];
return sum;
}
// driver program to test the above function
int main()
{
int n = 2;
cout << answer(n);
return 0;
}
Java
// Java program to calculate the number of
// n digit stepping numbers.
class GFG
{
// function that calculates the answer
static long answer(int n)
{
// dp[j] stores count of i digit
// stepping numbers ending with digit
// j.
int[] dp = new int[10];
// To store result of length i - 1
// before updating dp[j] for length i.
int[] prev = new int[10];
// if n is 1 then answer will be 10.
if (n == 1)
return 10;
// Initialize values for count of
// digits equal to 1.
for (int j = 0; j <= 9; j++)
dp[j] = 1;
// Compute values for count of digits
// more than 1.
for (int i = 2; i <= n; i++)
{
for (int j = 0; j <= 9; j++)
{
prev[j] = dp[j];
}
for (int j = 0; j <= 9; j++)
{
// If ending digit is 0
if (j == 0)
dp[j] = prev[j + 1];
// If ending digit is 9
else if (j == 9)
dp[j] = prev[j - 1];
// For other digits.
else
dp[j] = prev[j - 1] + prev[j + 1];
}
}
// stores the final answer
long sum = 0;
for (int j = 1; j <= 9; j++)
sum += dp[j];
return sum;
}
// Driver code
public static void main (String[] args)
{
int n = 2;
System.out.println(answer(n));
}
}
// This code is contributed by mits
Python3
# Python3 program to calculate the number of
# n digit stepping numbers.
# function that calculates the answer
def answer(n) :
# dp[j] stores count of i digit
# stepping numbers ending with digit j.
dp = [0] * 10
# To store resu1lt of length i - 1
# before updating dp[j] for length i.
prev = [0] * 10
# if n is 1 then answer will be 10.
if (n == 1):
return 10
# Initialize values for count of
# digits equal to 1.
for j in range(0, 10) :
dp[j] = 1
# Compute values for count of digits
# more than 1.
for i in range(2, n + 1):
for j in range (0, 10):
prev[j] = dp[j]
for j in range (0, 10):
# If ending digit is 0
if (j == 0):
dp[j] = prev[j + 1]
# If ending digit is 9
elif (j == 9) :
dp[j] = prev[j - 1]
# For other digits.
else :
dp[j] = prev[j - 1] + prev[j + 1]
# stores the final answer
sum = 0
for j in range (1, 10):
sum = sum + dp[j]
return sum
# Driver Code
n = 2
print(answer(n))
# This code is contributed by ihritik
C#
// C# program to calculate the number of
// n digit stepping numbers.
using System;
class GFG
{
// function that calculates the answer
static long answer(int n)
{
// dp[j] stores count of i digit
// stepping numbers ending with digit
// j.
int[] dp = new int[10];
// To store result of length i - 1
// before updating dp[j] for length i.
int[] prev = new int[10];
// if n is 1 then answer will be 10.
if (n == 1)
return 10;
// Initialize values for count of
// digits equal to 1.
for (int j = 0; j <= 9; j++)
dp[j] = 1;
// Compute values for count of digits
// more than 1.
for (int i = 2; i <= n; i++)
{
for (int j = 0; j <= 9; j++)
{
prev[j] = dp[j];
}
for (int j = 0; j <= 9; j++)
{
// If ending digit is 0
if (j == 0)
dp[j] = prev[j + 1];
// If ending digit is 9
else if (j == 9)
dp[j] = prev[j - 1];
// For other digits.
else
dp[j] = prev[j - 1] + prev[j + 1];
}
}
// stores the final answer
long sum = 0;
for (int j = 1; j <= 9; j++)
sum += dp[j];
return sum;
}
// Driver code
static void Main()
{
int n = 2;
Console.WriteLine(answer(n));
}
}
// This code is contributed by mits
PHP
输出:
17
时间复杂度: O(N)
辅助空间: O(1)