數字dp CQOI2016 手機號碼

2021-09-12 07:44:57 字數 1924 閱讀 5284

【題目描述】

人們選擇手機號碼時都希望號碼好記、吉利。比如號碼中含有幾位相鄰的相同數字、不含諧音不吉利的數字等。手機運營商在發行新號碼時也會考慮這些因素,從號段中選取含有某些特徵的號碼單獨**。為了便於前期規劃,運營商希望開發乙個工具來自動統計號段中滿足特徵的號碼數量。

工具需要檢測的號碼特徵有兩個:號碼中要出現至少 3個相鄰的相同數字;號碼中不能同時出現 8 和 4。號碼必須同時包含兩個特徵才滿足條件。滿足條件的號碼例如:13000988721、23333333333、14444101000。而不滿足條件的號碼例如:1015400080、10010012022。

手機號碼一定是 11 位數,前不含前導的 0。工具接收兩個數 l 和 r,自動統計出[l,r] 區間內所有滿足條件的號碼數量。l 和 r 也是 11 位的手機號碼。

【輸入描述】

輸入檔案內容只有一行,為空格分隔的兩個正整數 l,r

【輸出描述】

輸出檔案內容只有一行,為乙個整數,表示滿足條件的手機號數量。

樣例輸入

12121284000 12121285550

樣例輸出

5樣例解釋

滿足條件的號碼有:12121285000、 12121285111、 12121285222、 12121285333、 12121285550。

對於 30% 的資料,r−l≤10^7

對於 100% 的資料,10^10 ≤l≤r< 10^11

比較裸的數字dp。

我們思考轉移時需要哪些資訊,以及一些需要注意的細節。

題目中說4和8不能同時出現,所以我們需要儲存4和8是否出現過。

必須出現三個以上的相鄰且相同的數。因此我們需要儲存前乙個數是什麼(pre),儲存前乙個數已經連續出現了幾次(num)。

這道題要求了手機號碼必須是11位,因此不能有前導零。

搜尋到末狀態時,我們不清楚是否出現過三個以上相鄰且相等的數,因此我們需要儲存乙個bool來判斷。

是不是很簡單呀!!

#include

#include

#include

#include

#include

#include

#include

#include

#define re register

using

namespace std;

long

long a,b,c,n,m;

long

long len=0;

long

long q[

101]

;long

long lo[

101]

;long

long f[20]

[11][

21][2

][2]

[2];

long

long

dfs(

long

long pos,

long

long pre,

long

long num,

bool law,

bool lim,

bool is4,

bool is8,

bool zero)if(

!lim&&

!zero) f[pos]

[pre]

[num]

[law]

[is4]

[is8]

=ans;

return ans;

}long

long

ask(

long

long x)

return

dfs(11,

0,0,

0,1,

0,0,

1);}

intmain()

數字DP CQOI2016 手機號碼

這題的要求的是組成該數的數字滿足一些條件的數,並且看資料範圍,果斷鎖定數字dp。考場上我寫記憶化搜尋的把自己搞暈了,然後果斷改寫遞推版。f表示 n的滿足條件的 號碼,定義狀態7維 f ff i j f1 f2 f3 l 是否比n小 當前是第幾位 幾個連續 是否3個連續 是否有8 是否有4 當前選擇的...

1002 手機靚號

手機靚號 time limit 1000ms memory limit 65536k total submit 470 accepted 208 description description 小風涼剛買了手機,去營業廳開戶,營業員讓其挑選自己喜歡的號碼,但那麼多的號碼著實讓他眼花,他對號碼的要求是...

1176 手機靚號

1176 手機靚號 description 小風剛買了手機,去營業廳開戶,營業員讓其挑選自己喜歡的號碼,但那麼多號碼著實讓他眼花,他對號碼的要求是在號碼中6和8的個數要不少於5個,並且沒有數字4,於是請你給他編了乙個程式。input 輸入不多於50組的數,手機號碼 每個數以13或15開頭,長為11位...