數字DP POJ 3208 啟示錄

2021-10-10 03:12:06 字數 2830 閱讀 4586

題目大意:我們稱只要某數字的十進位制表示中有三個連續的6,我們就稱它為「魔鬼數」,比如:666,1666,6663,16666 等。現給出乙個數x,求「第x小的魔鬼數」。x≤5

×107

x\le 5\times 10^7

x≤5×10

7,一共有t組資料點,t

≤1000

t\le1000

t≤1000

。這一道題顯然是一道數字dp的題目,那麼我們先來了解一下什麼是數字dp

眾所周知

給定乙個閉區間 [l,

r]

[l,r]

[l,r

],讓你求這個區間中滿足某種條件的數的個數。

對於這類題目,我們通常先用動態規劃進行預處理,再基於拼湊思想,用「試填法」求出最終的答案。

面對這樣的一道題,如果直接每次都列舉到第x個「魔鬼數」,肯定會超時。那麼我們思考一下如何解決這個問題呢?

其實,這是一道數字dp的典型例題,根據其通常做法,我們可以打出乙個表記錄一下魔鬼數的個數,然後通過一些

「玄學 」的處理,來巧妙計算出第x個「魔鬼數」

我們設f[i

,3

]f [i,3]

f[i,3]

表示由i位數字構成的魔鬼數有多少個,

f [i

,j](

0≤j≤

2)

f [i,j] (0\le j \le2 )

f[i,j]

(0≤j

≤2) 表示由i

ii位數字構成,開頭已經有連續j

jj個6的非魔鬼數有多少個。(注意:在計算f時,我們允許前導0存在)。

實際上,在這裡**f[i

,3

]f [i,3]

f[i,3]

與 f[i,

j]

f[i,j]

f[i,j]

具有的含義是不同的。所以這兩者不是以同一種方式轉移的**

對於f [i,3

i,3i,

3] :它代表的是由i

ii位數字組成含有連續3個6的總方案數,這裡的6並不一定從第i

ii位開始,

然而對於f [i,j

i,ji,

j] :它代表的是從第i

ii位開始的有j

jj個6的方案數。

那麼,在考慮第i

ii位(最高位)是什麼數字時,易得轉移方程:

簡要概述一下上述轉移方程:

首先,對於j=0

j=0j=

0 的情況,即第i

ii位不放6,此時第i

ii位可以考慮從0∼9

0\sim9

0∼9除6以外的所有情況,此時一共有9種選擇,而i−1

i-1i−

1位往後,無論選了乙個6 oror

or兩個6都可以向此狀態轉移。

其次,再考慮j=1

j=1j=

1與j=

2j=2

j=2的情況,此時就很顯然第i−1

i-1i−

1位必須選乙個或者兩個,不過多贅述。

l as

tnot

thel

east

last\:\:not\:\:the\:\:least

lastno

tthe

leas

t f [i

,3

]f [i,3]

f[i,3]

的轉移就不一樣了,它又該分2種情況討論:

首先,是三個6從第i

ii位開始往下排,此時應該顯然由f[i

−1,2

]f [i-1,2]

f[i−1,

2]的方案數轉移過來,

然後由於還要繼承前i−1

i-1i−

1位的方案數,

又由於第i

ii位從0∼9

0\sim9

0∼9都可以選,且不會與之前重複,所以應該是10×f

[i−1

,3

]10\times f[i-1,3]

10×f[i

−1,3

] 至此,完成動態規劃後,預處理就完成了,我們就可以開開心心,快快樂樂的進入下一步了。

至此我們從左到右依次考慮每一位,同時記錄當前末尾已經有連續的幾個6。

從小到大列舉當前數字填的數字,通過預處理的f

ff陣列來直接計算魔鬼數的個數,與x

xx比較即可。

下面就是激動人心的上**時間了!

!!

#include

#include

#include

#include

#define ll long long

using

namespace std;

ll f[22]

[4];

//int t,x;

intmain()

while

(t--

)printf

("%d"

,j);

break;}

}puts(""

);}}

這是本蒟蒻的第一篇題解,寫出來還是很激動的,看著這一篇完完整整的題解,很有成就感。謹以這一篇題解紀念我接近一年半的oioi

oi生涯吧。(估計考完就退役了)

還有最後7天就要參加csp

−s

csp-s

csp−

s的比賽了,希望rp+

+!!!

rp++!\:!\:!

rp++!!

!

Poj3208 啟示錄 數字統計 DP

這題長得就比較像數字 dp 叭.所以先用 dp 進行預處理,再基於拼湊思想,通過 試填法 求出最終的答案.設 f i 3 表示由 i 位數字構成的魔鬼數有多少個,f i j 0 j 2 表示由 i 位數字組成的,開頭有 j 個 6 的非魔鬼數有多少個.注意,在計算 f i j 時允許前導 0 的存在...

遊戲啟示錄

暑假期間因為比較清閒,玩了很多遊戲。有些是近幾年的新遊戲,有些是古老的遊戲。自己在玩遊戲的過程中也總結出一些遊戲設計上的心得。下面一一介紹 1.魔法師傳奇。這個遊戲最近幾年出了第2部。可惜不知道是什麼原因,畫面是跳動的,而且進入遊戲後動滑鼠就宕機。無奈只得將其刪除。它是由曾經開發過 幽浮 的英國著名...

「摩根」啟示錄

摩根 啟示錄 1 摩根 公司創立 摩根 公司創立於2006年4月1日的一次 戰略管理與決策 沙盤模擬訓練。非常感謝公司給我們這樣一次全面體驗企業經營的機會。1.1沙盤模擬 沙盤模擬訓練源自西方軍事上的戰爭沙盤模擬推演,完全不同於傳統的灌輸授課方式,它通過模擬企業執行,使受訓者在主導 企業 各項經營管...