🔴 3966. Count Good Integers in a Range
🔗 🔴 3966. Count Good Integers in a Range
Problem Statement
題目簡述
給定三個整數 、 和 。如果一個正整數的任意相鄰數位之間的絕對差值都不超過 ,則稱該整數為「好數」。求區間 內好數的個數。
Constraints
約束條件
思路:雙邊界限制數位 DP
「統計區間內符合某種數位條件的整數個數」是典型的數位 DP 問題。直接枚舉最多要檢查 個數,顯然不可行;合理的做法是從高位到低位逐位填數字,並將重複的遞迴狀態記憶化。
本題的限制條件只和「前一個有效數位」有關——填入目前數位時,只要它和前一位的差值不超過 ,就能繼續往後填。
雙邊界數位 DP
一般寫法是 。但本題實作採用另一種方式:把 補前導零到與 等長,然後在同一趟搜索中同時維護是否貼著下界、是否貼著上界。
遞迴過程需要記錄四個資訊:目前填到哪一位、前一個有效數位是多少、是否仍受下界限制、是否仍受上界限制。
每一位的可填範圍由邊界狀態決定:若還貼著下界,最小值不能低於 的對應位;若還貼著上界,最大值不能高於 的對應位。一旦脫離某個邊界,該方向後續就可以自由選填 。
前導零不能參與差值判斷
由於 被補了前導零,在尚未填入真正數位之前,必須用一個特殊狀態表示「還沒有前一位」,以免第一個有效數位被前導零錯誤限制。
轉移時分兩種情況:
- 若還在補齊長度的前導零區域,可以選擇繼續跳過該位,且前一位狀態保持為「尚未開始」。
- 否則枚舉目前可填的數位,只要它是第一個有效數位,或與前一位的差值不超過 ,就可以遞迴到下一層。
複雜度分析
- 時間複雜度:,其中 為 的位數, 為數位基數。狀態數為 ,每個狀態最多枚舉 個目前數位。
- 空間複雜度:,即狀態數量。
Code
1 | class Solution: |
本部落格所有文章除特別聲明外,均採用CC BY-NC-SA 4.0 授權協議。轉載請註明來源 十六個天亮!
評論
WalineGiscus








![Luogu 🟣 P3195 [HNOI2008] 玩具装箱](https://i.gdst.dev/cover/P3195.webp)