HDU 3555 我的第一道數字DP

2021-06-17 18:32:33 字數 2403 閱讀 2907

題意就是找0到n有多少個數中含有49。資料範圍接近10^20

dp的狀態是2維的dp[len][3]

dp[len][0] 代表長度為len不含49的方案數

dp[len][1] 代表長度為len不含49但是以9開頭的數字的方案數

dp[len][2] 代表長度為len含有49的方案數

狀態轉移如下

dp[i][0] = dp[i-1][0] * 10 - dp[i-1][1];  // not include 49  如果不含49且,在前面可以填上0-9 但是要減去dp[i-1][1] 因為4會和9構成49

dp[i][1] = dp[i-1][0];  // not include 49 but starts with 9  這個直接在不含49的數上填個9就行了

dp[i][2] = dp[i-1][2] * 10 + dp[i-1][1]; // include 49  已經含有49的數可以填0-9,或者9開頭的填4

接著就是從高位開始統計

在統計到某一位的時候,加上 dp[i-1][2] * digit[i] 是顯然對的,因為這一位可以填 0 - (digit[i]-1)

若這一位之前挨著49,那麼加上 dp[i-1][0] * digit[i] 也是顯然對的。

若這一位之前沒有挨著49,但是digit[i]比4大,那麼當這一位填4的時候,就得加上dp[i-1][1]

**如下

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

#include

#include

#include

usingnamespacestd;

longlongdp[20][3];

intdigit[20];

intmain()

intt;

cin >> t;

while(t--)

boolflag =false;

for(inti =len; i>=1; i--)

cout << ans << endl;

}

return0;

}

hdu 3555 數字dp的dfs寫法

題意 給定乙個long long型別能夠存下的數字n,統計1 n之間含有49的數字的個數 思路 初始版本 需要記錄當前位置,前一位置放了那個數字,當前是否已經包含49,是否有上界這四個資訊,也就是dfs的四個引數。dfs pos,pre,istrue,limit 其實這種做法有點相當於把普通的數字d...

hdu 3555 含有49的數 數字dp

題目 題意 給定任意n,計算從1 n中有多少數包含49 分析 今天看到群裡有個人問這道題,我就做了一下,dfs就搞定了。看了一下題解,大部分是遞推,找規律求解。但是做題還是dfs include includeusing namespace std typedef long long ll ll f...

我學python的第一道題目

這是一道非常簡單但卻十分有意義的題目,它是我學python的開端。當時我正在圖書館奮力學習 偷偷打遊戲 突然電腦qq頭像跳動,是乙個女生問我一道python題目,沒錯就是這道題目。可是我雖然是學計算機的,但我沒學過python,只學了計算機導論 就是一本介紹計算機發展史和一些理論的教材 然後我花了乙...