題意就是找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
using
namespace
std;
long
long
dp[20][3];
int
digit[20];
int
main()
int
t;
cin >> t;
while
(t--)
bool
flag =
false
;
for
(
int
i =len; i>=1; i--)
cout << ans << endl;
}
return
0;
}
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,只學了計算機導論 就是一本介紹計算機發展史和一些理論的教材 然後我花了乙...