首页 > 其他分享 >数位DP-902. 最大为 N 的数字组合

数位DP-902. 最大为 N 的数字组合

时间:2022-08-14 22:35:38浏览次数:53  
标签:902 digits return 数字 示例 res False DP 数位

问题描述

给定一个按 非递减顺序 排列的数字数组 digits 。你可以用任意次数 digits[i] 来写的数字。例如,如果 digits = ['1','3','5'],我们可以写数字,如 '13', '551', 和 '1351315'。

返回 可以生成的小于或等于给定整数 n 的正整数的个数 。

示例 1:

输入:digits = ["1","3","5","7"], n = 100
输出:20
解释:
可写出的 20 个数字是:
1, 3, 5, 7, 11, 13, 15, 17, 31, 33, 35, 37, 51, 53, 55, 57, 71, 73, 75, 77.
示例 2:

输入:digits = ["1","4","9"], n = 1000000000
输出:29523
解释:
我们可以写 3 个一位数字,9 个两位数字,27 个三位数字,
81 个四位数字,243 个五位数字,729 个六位数字,
2187 个七位数字,6561 个八位数字和 19683 个九位数字。
总共,可以使用D中的数字写出 29523 个整数。
示例 3:

输入:digits = ["7"], n = 8
输出:1

提示:

1 <= digits.length <= 9
digits[i].length == 1
digits[i] 是从 '1' 到 '9' 的数
digits 中的所有值都 不同 
digits 按 非递减顺序 排列
1 <= n <= 109

问题求解

class Solution:
    def atMostNGivenDigitSet(self, digits: List[str], n: int) -> int:
        s = str(n)

        @cache
        def f(i, is_limit, is_num):
            if i == len(s):
                return int(is_num)
            
            res = 0
            if not is_num:
                res += f(i + 1, False, False)

            up = s[i] if is_limit else "9"
            for d in digits:
                if d > up: break
                res += f(i + 1, is_limit and d == up, True)
            
            return res
        
        return f(0, True, False)

标签:902,digits,return,数字,示例,res,False,DP,数位
From: https://www.cnblogs.com/hyserendipity/p/16586560.html

相关文章

  • P5131 荷取融合——计数dp,组合计数
    本题是一个计数类的问题,其中需要有一些优化。简单思路从题面和数据范围,可以猜测算法时间复杂度大概是\(O(nk)\),所以不难想到用动态规划:设\(f(i,j)\)为前\(i\)个数中选\(......
  • 数位DP-1012. 至少有 1 位重复的数字
    问题描述给定正整数 n,返回在 [1,n] 范围内具有至少1位重复数字的正整数的个数。示例1:输入:n=20输出:1解释:具有至少1位重复数字的正数(<=20)只有11。示......
  • 【luogu CF1710C】XOR Triangle(数位DP)
    XORTriangle题目链接:luoguCF1710C题目大意给你一个数n,要你求有多少个满足条件的a,b,c使得它们两两异或得到的三个值可以得到一个非退化三角形。其中a,b,c值域在......
  • 周回顾并发编程与数据库08.14:UDP协议、操作系统发展史、相关名词、进程、线程、验证py
    目录UDP协议操作系统发展史相关名词进程线程锁信号量event事件池协程数据库MySQLSQL与NoSQL内容UDP协议Internet协议集支持一个无连接的传输协议,该协议......
  • 树形dp
    ##1.换根dp1.kamp首先肯定它是换根dp因为最后一次不用回到起点,所以先不去想别的,最后再减去一个最长链设g\([i],\)为以i为根前往在这颗子树中的家的最小距离\(f[i],\)......
  • 数位DP-2出现的次数
    问题描述编写一个方法,计算从0到n(含n)中数字2出现的次数。示例:输入:25输出:9解释:(2,12,20,21,22,23,24,25)(注意22应该算作两次)提示:n<=10......
  • 拉格朗日插值优化DP
    拉格朗日插值优化DP模拟赛出现神秘插值,太难啦!!回忆拉格朗日插值是用来做什么的对于一个多项式\(F(x)\),如果已知它的次数为\(m-1\),且已知\(m\)个点值,那么可以得到\[F(k......
  • P7154 [USACO20DEC] Sleeping Cows P(DP)
    主要是状态设计比较难想,但其实可以理性地推出来。P7154[USACO20DEC]SleepingCowsP考虑最终一个合法状态是怎么样的:一定是一堆小牛棚,一堆大奶牛,最大的牛棚小于最小的......
  • P6144 [USACO20FEB]Help Yourself P(DP+线段树)
    P6144[USACO20FEB]HelpYourselfP将线段按照了\(r\)排序,设右端点为\(r\)的答案为\(f_r\),发现这样转移非常困难。\(\color{yellow}{\bigstar\texttt{Trick}}\):区间......
  • CF559E Gerald and Path(DP)
    CF559EGeraldandPath设\(dp(i,p)\)表示完成前\(i\)条线段的覆盖,最右端位于\(p\)点的最大收益。转移?向下一条线段转移时加上他们中间的距离?发现这样没有办法统计......