📜  n位数的步进数

📅  最后修改于: 2021-04-24 14:42:08             🧑  作者: Mango

给定n,找到n位步进数的计数。如果所有相邻数字的绝对差为1,则该数字称为步进数。321是步进数,而421不是。

例子 :

Input : 2 
Output : 17
Explanation: The numbers are 10, 12, 21, 
23, 32, 34, 43, 45, 54, 56, 65, 67, 76, 
78, 87, 89, 98.

Input : 1
Output : 10
Explanation: the numbers are 0, 1, 2, 3, 
4, 5, 6, 7, 8, 9.

天真的方法是对所有n位数字运行循环,并检查每个数字是否为“步进”。

一种有效的方法是使用动态编程。

In dp[i][j], i denotes number of
digits and j denotes last digit.

// If there is only one digit
if (i == 1)
   dp(i, j) = 1;

// If last digit is 0.
if (j == 0) 
   dp(i, j) = dp(i-1, j+1)

// If last digit is 9
else if (j == 9) 
   dp(i, j) = dp(i-1, j-1)

// If last digit is neither 0
// nor 9.
else 
   dp(i, j) = dp(i-1, j-1) + 
              dp(i-1, j+1)

Result is ∑dp(n, j) where j varies
from 1 to 9. 
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[i][j] stores count of i digit
    // stepping numbers ending with digit
    // j.
    int dp[n + 1][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[1][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++) {
  
            // If ending digit is 0
            if (j == 0)
                dp[i][j] = dp[i - 1][j + 1];
  
            // If ending digit is 9
            else if (j == 9)
                dp[i][j] = dp[i - 1][j - 1];
  
            // For other digits.
            else
                dp[i][j] = dp[i - 1][j - 1] + 
                           dp[i - 1][j + 1];
        }
    }
  
    // stores the final answer
    long long sum = 0;
    for (int j = 1; j <= 9; j++)
        sum += dp[n][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[i][j] stores count of i 
        // digit stepping numbers ending 
        // with digit j.
        int dp[][] = new int[n+1][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[1][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++) {
       
                // If ending digit is 0
                if (j == 0)
                    dp[i][j] = dp[i - 1][j + 1];
       
                // If ending digit is 9
                else if (j == 9)
                    dp[i][j] = dp[i - 1][j - 1];
       
                // For other digits.
                else
                    dp[i][j] = dp[i - 1][j - 1] + 
                               dp[i - 1][j + 1];
            }
        }
       
        // stores the final answer
        long sum = 0;
        for (int j = 1; j <= 9; j++)
            sum += dp[n][j];
        return sum;
    }
       
    // driver program to test the above function
    public static void main(String args[])
    {
        int n = 2;
        System.out.println(answer(n));
    }
}
  
/*This code is contributed by Nikita tiwari.*/


Python3
# Python3 program to calculate 
# the number of n digit
# stepping numbers.
  
# function that calculates
# the answer
def answer(n):
      
    # dp[i][j] stores count of 
    # i digit stepping numbers 
    # ending with digit j.
    dp = [[0 for x in range(10)] 
             for y in range(n + 1)];
  
    # if n is 1 then answer
    # will be 10.
    if (n == 1):
        return 10;
    for j in range(10):
        dp[1][j] = 1;
  
    # Compute values for count 
    # of digits more than 1.
    for i in range(2, n + 1): 
        for j in range(10): 
              
            # If ending digit is 0
            if (j == 0):
                dp[i][j] = dp[i - 1][j + 1];
                  
            # If ending digit is 9
            elif (j == 9):
                dp[i][j] = dp[i - 1][j - 1];
                  
            # For other digits.
            else:
                dp[i][j] = (dp[i - 1][j - 1] + 
                            dp[i - 1][j + 1]);
                  
    # stores the final answer
    sum = 0;
    for j in range(1, 10):
        sum = sum + dp[n][j];
    return sum;
  
# Driver Code
n = 2;
print(answer(n));
  
# This code is contributed 
# by mits


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[i][j] stores count of i 
        // digit stepping numbers ending 
        // with digit j.
        int [,]dp = new int[n+1,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[1,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++) {
      
                // If ending digit is 0
                if (j == 0)
                    dp[i,j] = dp[i - 1,j + 1];
      
                // If ending digit is 9
                else if (j == 9)
                    dp[i,j] = dp[i - 1,j - 1];
      
                // For other digits.
                else
                    dp[i,j] = dp[i - 1,j - 1] + 
                               dp[i - 1,j + 1];
            }
        }
      
        // stores the final answer
        long sum = 0;
        for (int j = 1; j <= 9; j++)
            sum += dp[n,j];
              
        return sum;
    }
      
    // driver program to test the above function
    public static void Main()
    {
        int n = 2;
          
        Console.WriteLine(answer(n));
    }
}
  
/*This code is contributed by vt_m.*/


PHP



输出 :

17

时间复杂度: O(n)
辅助空间: O(n)n位步进数|空间优化的解决方案