【校內模擬】【18-10-31】幾串字符 【數位DP】

題解

30pts

考慮到L和R的範圍都很小,直接暴力枚舉L~R然後統計答案即可。

70pts

如果觀察一下,你會發現以下幾個性質:

1.num01+num10+num11+num00= len-1。
2. num01+1≥num10≥num01,因爲10,01是交替出現的。
3. num10+num00 是0出現的次數。
4. num01+num11+1 是1出現的次數。

這個可以自己手推一下,很容易證明。

那麼這個字符串長什麼樣,其實已經大體確定了,舉例說明:

10001010110111111010

由於所有的01和10之間全是1,所有的10和01之間全是0,因此我們可以把字符串看成幾段:

1 000 1 0 1 0 11 0 111111 0 1 0

考慮數位DP,記錄當前是第 i 位,前面出現了 j段,1 (或0) 出現了 k 次的方案數,再多記一個是否超過上界,枚舉下一位轉移即可。

100pts

如果我們已知上界R是 1011100010

那麼對於前五位是 10110 的數來說,後面的位置無論怎麼選都不會超過R。

我們就考慮啊,能不能快速算出這時候符合條件的方案數呢?

還真可以!

我們從第一位往最後一位掃一遍,過程中記錄後面還能出現多少個0和1(具體實現是記錄10,00,01,11的個數)。每掃到一個爲1的位置,考慮如果我們在這一位放0的話後面就可以亂選了,因此我們就給ans加上當前位及之前已經確定,後面隨便選,且符合條件的方案數。這個方案數可以這麼表示:

Cnum11+num01+1num11C_{num_{11}+num_{01}+1}^{num_{11}} +Cnum00+num10num10C_{num_{00}+num_{10}}^{num_{10}}

如果不能一下子理解,可以回到上面去看下那幾個式子,帶進來理解一下。

其實這就是個球盒問題,是

球相同(每一段1內部的1的順序不重要)

盒子不同(每一段的前後位置不同)

且不能空盒(每一段都不爲空)

的那一種。

所以就這樣 logR 的掃一遍,再 logL 的掃一遍,把兩個答案減一下,就做完啦~

最後,因爲你計算的是<R和<L的方案數,相減得到的ans是在[L,R)的區間,所以還需要特判R本身能否滿足條件。

至此,我們就開心的做完啦~

當然具體的實現還需要判斷一些特殊的情況,比如當lenL或lenR小於合法長度的時候直接返回方案數爲0,lenL或lenR大於合法長度時直接返回所有滿足條件的方案數,這些就是細節問題啦。

總結

看到的第一眼就想到了數位DP,礙於自己連數位DP的模板題都沒練過只好打了30pts的暴力……

其實這道題還是在尋找規律,尋找的是給定的01,00,10,11的個數與1的個數、0的個數、合法方案的長度之間的關係。

所以我得好好補習數論否則就透心涼心飛揚了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章