如果每个数字(第一个除外)都大于或等于前一个数字,则该数字是非递减的。例如,223、4455567、899 是非递减的数字。
因此,给定位数 n,您需要找到具有 n 位数的总非减少数字的计数。
例子:
Input: n = 1
Output: count = 10
Input: n = 2
Output: count = 55
Input: n = 3
Output: count = 220
我们强烈建议您将浏览器最小化,然后自己先尝试一下。
看待问题的一种方法是,数字计数等于以 9 结尾的 n 位数字加上以数字 8 结尾的计数加上 7 的计数,依此类推。如何获得以特定数字结尾的计数?我们可以重复 n-1 个长度和小于或等于最后一位的数字。所以下面是递归公式。
Count of n digit numbers = (Count of (n-1) digit numbers Ending with digit 9) +
(Count of (n-1) digit numbers Ending with digit 8) +
.............................................+
.............................................+
(Count of (n-1) digit numbers Ending with digit 0)
让以数字 ‘d’ 和长度 n 结尾的计数为 count(n, d)
count(n, d) = ∑(count(n-1, i)) where i varies from 0 to d
Total count = ∑count(n-1, d) where d varies from 0 to n-1
上述递归解决方案将有许多重叠的子问题。因此,我们可以使用动态规划以自底向上的方式构建表格。
以下是上述想法的实现:
C++
// C++ program to count non-decreasing number with n digits
#include
using namespace std;
long long int countNonDecreasing(int n)
{
// dp[i][j] contains total count of non decreasing
// numbers ending with digit i and of length j
long long int dp[10][n+1];
memset(dp, 0, sizeof dp);
// Fill table for non decreasing numbers of length 1
// Base cases 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
for (int i = 0; i < 10; i++)
dp[i][1] = 1;
// Fill the table in bottom-up manner
for (int digit = 0; digit <= 9; digit++)
{
// Compute total numbers of non decreasing
// numbers of length 'len'
for (int len = 2; len <= n; len++)
{
// sum of all numbers of length of len-1
// in which last digit x is <= 'digit'
for (int x = 0; x <= digit; x++)
dp[digit][len] += dp[x][len-1];
}
}
long long int count = 0;
// There total nondecreasing numbers of length n
// wiint be dp[0][n] + dp[1][n] ..+ dp[9][n]
for (int i = 0; i < 10; i++)
count += dp[i][n];
return count;
}
// Driver program
int main()
{
int n = 3;
cout << countNonDecreasing(n);
return 0;
}
Java
class NDN
{
static int countNonDecreasing(int n)
{
// dp[i][j] contains total count of non decreasing
// numbers ending with digit i and of length j
int dp[][] = new int[10][n+1];
// Fill table for non decreasing numbers of length 1
// Base cases 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
for (int i = 0; i < 10; i++)
dp[i][1] = 1;
// Fill the table in bottom-up manner
for (int digit = 0; digit <= 9; digit++)
{
// Compute total numbers of non decreasing
// numbers of length 'len'
for (int len = 2; len <= n; len++)
{
// sum of all numbers of length of len-1
// in which last digit x is <= 'digit'
for (int x = 0; x <= digit; x++)
dp[digit][len] += dp[x][len-1];
}
}
int count = 0;
// There total nondecreasing numbers of length n
// wiint be dp[0][n] + dp[1][n] ..+ dp[9][n]
for (int i = 0; i < 10; i++)
count += dp[i][n];
return count;
}
public static void main(String args[])
{
int n = 3;
System.out.println(countNonDecreasing(n));
}
}/* This code is contributed by Rajat Mishra */
Python3
# Python3 program to count
# non-decreasing number with n digits
def countNonDecreasing(n):
# dp[i][j] contains total count
# of non decreasing numbers ending
# with digit i and of length j
dp = [[0 for i in range(n + 1)]
for i in range(10)]
# Fill table for non decreasing
# numbers of length 1.
# Base cases 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
for i in range(10):
dp[i][1] = 1
# Fill the table in bottom-up manner
for digit in range(10):
# Compute total numbers of non
# decreasing numbers of length 'len'
for len in range(2, n + 1):
# sum of all numbers of length
# of len-1 in which last
# digit x is <= 'digit'
for x in range(digit + 1):
dp[digit][len] += dp[x][len - 1]
count = 0
# There total nondecreasing numbers
# of length n won't be dp[0][n] +
# dp[1][n] ..+ dp[9][n]
for i in range(10):
count += dp[i][n]
return count
# Driver Code
n = 3
print(countNonDecreasing(n))
# This code is contributed
# by sahilshelangia
C#
// C# program to print sum
// triangle for a given array
using System;
class GFG {
static int countNonDecreasing(int n)
{
// dp[i][j] contains total count
// of non decreasing numbers ending
// with digit i and of length j
int [,]dp = new int[10,n + 1];
// Fill table for non decreasing
// numbers of length 1 Base cases
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
for (int i = 0; i < 10; i++)
dp[i, 1] = 1;
// Fill the table in bottom-up manner
for (int digit = 0; digit <= 9; digit++)
{
// Compute total numbers of non decreasing
// numbers of length 'len'
for (int len = 2; len <= n; len++)
{
// sum of all numbers of length of len-1
// in which last digit x is <= 'digit'
for (int x = 0; x <= digit; x++)
dp[digit, len] += dp[x, len - 1];
}
}
int count = 0;
// There total nondecreasing numbers
// of length n wiint be dp[0][n]
// + dp[1][n] ..+ dp[9][n]
for (int i = 0; i < 10; i++)
count += dp[i, n];
return count;
}
// Driver code
public static void Main()
{
int n = 3;
Console.WriteLine(countNonDecreasing(n));
}
}
// This code is contributed by Sam007.
PHP
Javascript
C++
// C++ program to count non-decreasing numner with n digits
#include
using namespace std;
long long int countNonDecreasing(int n)
{
int N = 10;
// Compute value of N*(N+1)/2*(N+2)/3* ....*(N+n-1)/n
long long count = 1;
for (int i=1; i<=n; i++)
{
count *= (N+i-1);
count /= i;
}
return count;
}
// Driver program
int main()
{
int n = 3;
cout << countNonDecreasing(n);
return 0;
}
Java
// java program to count non-decreasing
// numner with n digits
public class GFG {
static long countNonDecreasing(int n)
{
int N = 10;
// Compute value of N * (N+1)/2 *
// (N+2)/3 * ....* (N+n-1)/n
long count = 1;
for (int i = 1; i <= n; i++)
{
count *= (N + i - 1);
count /= i;
}
return count;
}
// Driver code
public static void main(String args[]) {
int n = 3;
System.out.print(countNonDecreasing(n));
}
}
// This code is contributed by Sam007.
Python3
# python program to count non-decreasing
# numner with n digits
def countNonDecreasing(n):
N = 10
# Compute value of N*(N+1)/2*(N+2)/3
# * ....*(N+n-1)/n
count = 1
for i in range(1, n+1):
count = int(count * (N+i-1))
count = int(count / i )
return count
# Driver program
n = 3;
print(countNonDecreasing(n))
# This code is contributed by Sam007
C#
// C# program to count non-decreasing
// numner with n digits
using System;
class GFG {
static long countNonDecreasing(int n)
{
int N = 10;
// Compute value of N * (N+1)/2 *
// (N+2)/3 * ....* (N+n-1)/n
long count = 1;
for (int i = 1; i <= n; i++)
{
count *= (N + i - 1);
count /= i;
}
return count;
}
public static void Main()
{
int n = 3;
Console.WriteLine(countNonDecreasing(n));
}
}
// This code is contributed by Sam007.
PHP
Javascript
输出:
220
感谢 Gaurav Ahirwar 提出上述方法。
另一种方法是基于下面的直接公式
Count of non-decreasing numbers with n digits =
N*(N+1)/2*(N+2)/3* ....*(N+n-1)/n
Where N = 10
以下是使用上述公式计算计数的程序。
C++
// C++ program to count non-decreasing numner with n digits
#include
using namespace std;
long long int countNonDecreasing(int n)
{
int N = 10;
// Compute value of N*(N+1)/2*(N+2)/3* ....*(N+n-1)/n
long long count = 1;
for (int i=1; i<=n; i++)
{
count *= (N+i-1);
count /= i;
}
return count;
}
// Driver program
int main()
{
int n = 3;
cout << countNonDecreasing(n);
return 0;
}
Java
// java program to count non-decreasing
// numner with n digits
public class GFG {
static long countNonDecreasing(int n)
{
int N = 10;
// Compute value of N * (N+1)/2 *
// (N+2)/3 * ....* (N+n-1)/n
long count = 1;
for (int i = 1; i <= n; i++)
{
count *= (N + i - 1);
count /= i;
}
return count;
}
// Driver code
public static void main(String args[]) {
int n = 3;
System.out.print(countNonDecreasing(n));
}
}
// This code is contributed by Sam007.
蟒蛇3
# python program to count non-decreasing
# numner with n digits
def countNonDecreasing(n):
N = 10
# Compute value of N*(N+1)/2*(N+2)/3
# * ....*(N+n-1)/n
count = 1
for i in range(1, n+1):
count = int(count * (N+i-1))
count = int(count / i )
return count
# Driver program
n = 3;
print(countNonDecreasing(n))
# This code is contributed by Sam007
C#
// C# program to count non-decreasing
// numner with n digits
using System;
class GFG {
static long countNonDecreasing(int n)
{
int N = 10;
// Compute value of N * (N+1)/2 *
// (N+2)/3 * ....* (N+n-1)/n
long count = 1;
for (int i = 1; i <= n; i++)
{
count *= (N + i - 1);
count /= i;
}
return count;
}
public static void Main()
{
int n = 3;
Console.WriteLine(countNonDecreasing(n));
}
}
// This code is contributed by Sam007.
PHP
Javascript
输出:
220
感谢 Abhishek Somani 提出这种方法。
这个公式是如何工作的?
N * (N+1)/2 * (N+2)/3 * .... * (N+n-1)/n
Where N = 10
让我们尝试不同的 n 值。
For n = 1, the value is N from formula.
Which is true as for n = 1, we have all single digit
numbers, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.
For n = 2, the value is N(N+1)/2 from formula
We can have N numbers beginning with 0, (N-1) numbers
beginning with 1, and so on.
So sum is N + (N-1) + .... + 1 = N(N+1)/2
For n = 3, the value is N(N+1)/2(N+2)/3 from formula
We can have N(N+1)/2 numbers beginning with 0, (N-1)N/2
numbers beginning with 1 (Note that when we begin with 1,
we have N-1 digits left to consider for remaining places),
(N-2)(N-1)/2 beginning with 2, and so on.
Count = N(N+1)/2 + (N-1)N/2 + (N-2)(N-1)/2 +
(N-3)(N-2)/2 .... 3 + 1
[Combining first 2 terms, next 2 terms and so on]
= 1/2[N2 + (N-2)2 + .... 4]
= N*(N+1)*(N+2)/6 [Refer this , putting n=N/2 in the
even sum formula]
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。