總結 數字 DP

2022-09-19 04:48:13 字數 1357 閱讀 8376

我們用 \(a=\overline a_ a_ \cdots a_)_b}\) 表示乙個 \(n\) 位 \(b\) 進製數(大多數情況下 \(b=10\) 或 \(b=2\) )。

令集合 \(s_b=\ a_ a_ \cdots a_)_b}|n\in[1,\infty)\cap z,a_i\in[0,b]\cap z\}\) 為所有 \(b\) 進製數構成的集合

抽象地來說,一般來說數字 \(\text\) 要解決的問題都可以轉化成下面形式的問題:

定義函式 \(p:s_b\to \\) ,求函式 \(f([l,r])=\sum_ p(x)\) 。

科協裡最近很流行數字遊戲。

某人命名了一種不降數,這種數字必須滿足從左到右各位數字呈非下降關係,如 \(123,446\)。

現在大家決定玩乙個遊戲,指定乙個整數閉區間 \([a,b]\),問這個區間內有多少個不降數。

\(1\le a\le b<2^\)

令 \(s(i)=\sum_ f([st,k])\) 。

若 \(l,r \ge st\) ,那麼一定有 \(f([l,r])= s(r) - s(l-1)\) 。

那麼我們可以將問題轉化為:

我們轉化的問題為有多少整數 \(v \le \overline a_ a_ \cdots a_}\) 滿足從左到右各位數字呈非下降關係。

對於該問題最棘手的限制其實是對 \(v\) 大小限制(上界)的限制。

為了方便思考我們將所有不帶前補 \(0\) 的 \(k < n\) 位 \(b\) 進製數補成帶前補 \(0\) 的 \(n\) 位 \(b\) 進製數。

考慮兩個帶前補 \(0\) 的 \(n\) 位 \(10\) 進製整數:

\(a=\overline a_ a_ \cdots a_}\)

\(b=\overline b_ b_ \cdots b_}\)

其中 \(b < a\) 。

考慮乙個位置 \(k\) ,滿足 \(\forall i> k,a_i=b_i,a_k>b_k\) 。

乙個直觀的標記:

\(a=\overline \cdots a_} \cdots a_}\)

\(b=\overline \cdots b_} \cdots b_}\)

關於這個位置 \(k\) 有兩個顯然但十分重要的性質:

那麼我們就可以將 \(k\) 作為集合劃分的依據,列舉 \(k=k_i\) 時的數的個數。

接下來考慮對於 \(k=k_i\) 時的集合劃分情況:

我們考慮 \(k_i\) 位的取值,因為已經第 \(k_i\) 位一定比 \(a\) 小,所以剩下的 \(k_i\) 位可以隨便填數。

那麼接下來要解決的問題即:

而對於這個問題我們可以用乙個十分簡單的 \(\text\) 解決。

數字DP 總結

數字dp適合在一段數的區間內找出滿足某些條件的數的個數,這個時候往往不能之間遍歷,肯定會超時,則一般使用數字dp來解決。數字dp的常見形式是dp i j 表示開頭是j的i位數滿足條件的有多少個,當然也有其他dp i j k 等等,但i,j,k都很小,不會像直接遍歷那麼耗時。以前做過乙個不要62的題 ...

數字DP總結

數字dp基於動態的思想,記錄狀態以至於不用重複的計算,能夠處理大規模的數 其時間複雜度為o 狀態數 轉移數 狀態數是dp陣列的大小,轉移數是for迴圈大小 這個時間我也不是很想得通,某大佬講的。比較簡單的幾種題型 1 求l r數字中包含某些數字特徵的數量和 如數字子串中是否有13等 hdu 2089...

數字dp總結

到這裡,數字dp就告一段落了,kuangbin的專題還差一道,那一道涉及到了ac自動機,目前還不可做。簡單寫下數字dp的總結 數字dp有它固定的模板,例如solve,dfs函式的大體寫法,和limit的處理。唯一不同的地方就是字首狀態state的維護,最為詳細的state記法就是把前面所選擇的每乙個...