數位DP練習題。

題目

輸入一個遞增排序的整數陣列digtis。你可以使用digit中的任意數字任意次,來組成新的整數。
例如digits = [‘1’,’3’,’5’],則可以組成’13’,’551’,’135315’等整數。

回傳可組成小於等於n的整數有多少。

解法

這題相較之下簡單很多,符合n的限制以外,只要求使用的位數在digits陣列之中。
而且digits陣列已經是遞增且不包含重複數字,我們只要依照當前位數是否受限於n來決定上限,列舉所有可使用的數字即可。

class Solution:
    def atMostNGivenDigitSet(self, digits: List[str], n: int) -> int:
        s=str(n)
        N=len(s)
        digits=list(map(int,digits))
        
        @cache
        def dp(i,is_limit,is_num):
            if i==N:
                return is_num
            up=int(s[i]) if is_limit else 9
            ans=0
            if not is_num:
                ans=dp(i+1,False,False)
            for j in digits:
                if j>up:break
                ans+=dp(i+1,is_limit and j==up,True)
            return ans
        
        return dp(0,True,False)