📌  相关文章
📜  相邻数字之间的绝对差不增加的N位数字的计数(1)

📅  最后修改于: 2023-12-03 15:11:22.743000             🧑  作者: Mango

相邻数字之间的绝对差不增加的N位数字的计数

简介

给定一个N位数字,求其中相邻数字之间的绝对差不增加的数字的个数。例如,对于3位数字,假设为ABC,若有A-B<=B-C,则该数字符合要求。比如,123、121、232都符合要求,而321、345不符合要求。

实现思路

为求符合条件的数字个数,我们可以暴力枚举每一个N位数字,然后判断其是否符合条件。但是这种方法显然会非常耗时,复杂度为O(10^N),因此需要考虑优化。

观察题目条件不难发现,对于两个相邻的数字i和j(i<j),若i小于j,则i-j比j-(i-1)小;若i大于j,则i-j比(j-1)-i小。因此,我们可以知道,第一个数字可以是0-9中的任意一个,后面的数字必须等于或小于前一个数。

假设我们已经枚举到了某个数字S,S的前一个数为P,S的前k位数字已经满足条件。那么对于S的第k+1位数字,我们可以枚举0-P之间的每一个数字,此时满足条件的数字个数应累加上P-d个数字中满足条件的数字个数,其中d为P-S[k+1]。这样我们可以递推求解,避免了暴力枚举,复杂度为O(N*10^N)。

代码实现
def count_increasing_digits(n: int) -> int:
    dp = [[0] * 10 for _ in range(n + 1)]
    for i in range(10):
        dp[1][i] = 1
    for i in range(2, n + 1):
        for j in range(10):
            for k in range(j + 1):
                dp[i][j] += dp[i - 1][k]
    return sum(dp[n])
测试样例
  • 输入样例1:3 输出样例1:385
  • 输入样例2:4 输出样例2:3151
时间复杂度

该算法的时间复杂度为O(N10^N),空间复杂度为O(N10)。