• 算法66------计算各个位数不同的数字个数【动态规划】


    一、题目:计算各个位数不同的数字个数

    给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10

    示例:

    输入: 2
    输出: 91 
    解释: 答案应为除去 11,22,33,44,55,66,77,88,99 外,在 [0,100) 区间内的所有数字。

    思路:动态规划

    dp[i]表示 i 位数范围内【0,10^i】各位数字都不同的数字 x 的个数。

    • 当 n = 1 时, 只有 0 符合条件, 当 n = 10 时, 0 - 9 符合条件 (10个);
    •  当 n >= 2 时,记 f( n )为 [ 0, 10^n )范围内满足条件的数值个数,记 g( k ) 为 k位数中满足条件的数值个数, 则 f(n) = g(1) + g(2) + g(3) + ... +g(n) = f (n - 1) + g (n),

    而 g(n) 属于组合问题, g(n) = 9 * 9 * 8 * 7 *...... * (11 - n),第一个“9”代表最高位上可选择的数为“ 1 ~ 9”九个,0 不可选,第二个“9”代表第二位上可选择的数为“0 ~ 9”中除去高位所选的其他九个数,依次类推,第 n 位上可选的数有 ( 11 - n ) 个。

    即,dp[0] = 10,dp[0]表示n=1时,结果是10

    dp[1] = 91,dp【1】表示n = 2时,结果为dp[0] + 9*9 = 91

    dp[2] = 739,dp【2】表示n=3时,结果为dp[1] + 9 * 9 * 8 = 91 + 648 = 739

    代码:

    def countNumbersWithUniqueDigits(n):
        if n == 0:
            return 1
        dp = [0] * n
        dp[0] = 10
        for i in range(1,n):
            fi = 9
            for j in range(9,9-i,-1):
                fi *= j
            dp[i] = dp[i-1] + fi
        return dp[-1]
    n =3
    countNumbersWithUniqueDigits(n)
  • 相关阅读:
    7 文件操作
    初识字典1
    软件工程学习进度
    AAAA
    软件工程期末总结
    【操作系统】实验四 主存空间的分配和回收 截止提交时间:2016.6.17
    约教网站开发(一)
    操作系统实验三
    .Scrum团队成立
    数学精灵改进
  • 原文地址:https://www.cnblogs.com/Lee-yl/p/10057696.html
Copyright © 2020-2023  润新知