ZJOI2010 數字計數

2022-09-09 01:00:25 字數 1117 閱讀 9902

給定兩個正整數a和b,求在[a,b]中的所有整數中,每個數碼(digit)各出現了多少次。

輸入檔案中僅包含一行兩個整數a、b,含義如上所述。

輸出檔案中包含一行10個整數,分別表示0-9在[a,b]**現了多少次。

輸入 #1

1 99

輸出 #1

9 20 20 20 20 20 20 20 20 20

30%的資料中,a<=b<=10^6;

100%的資料中,a<=b<=10^12。

【解題思路】

關於數字dp,(數字dp的題只有dfs才是通解) 個人認為dfs**要比遞推的**簡潔不少,而且更易理解。

題解已經有乙個四維的dfs了,實際上這個題陣列只需要開兩維,可以省掉兩維,於是發乙個二維的。

先說下思路,對於這道數字dp的水題我們考慮用記憶化搜尋來解決。定義num陣列來拆數,顯然需要bool limit和lead來分別判斷是否達有限制和是否有前導0。有前導0設為0,有限制為1。具體請看**。

【code】

1 #include2 #include3 #include4 #include5

using

namespace

std;

6long

long

a , b;

7long

long dp[20][20],num[20];8

long

long dfs(int pos,bool limit,bool lead,int dig,long

long

sum)9//

sum是一定需要存的乙個變數,因為她表示的是操作答案,需要不斷隨dfs更新

10 //

數字dp的操作

21long

long work(long

long x,int

d)22

30return dfs(len,1,0,d,0

);31}32

intmain()

3341

return ^-^;

42 }

ZJOI2010 數字計數

題目描述 給定兩個正整數a和b,求在 a,b 中的所有整數中,每個數碼 digit 各出現了多少次。輸入格式 輸入檔案中僅包含一行兩個整數a b,含義如上所述。輸出格式 輸出檔案中包含一行10個整數,分別表示0 9在 a,b 現了多少次。輸入輸出樣例 輸入 1 1 99 輸出 1 9 20 20 2...

ZJOI2010 數字計數

這道題題意清晰明了。最好的方法用字首差求,即 0,b 0,a 1 首先拆位把每位存到陣列中,並求出位數 l 然後把這些數當成 l 位進行統計,不足 l 位的先補字首 0 最後減去多餘的字首 0 即可。下面求 0,a 各個數出現次數的方法大體是 例如 0,1320 1320 中 l 為 4 第一位為 ...

ZJOI2010 數字計數

給定兩個正整數 a 和 b 求在 a,b 中的所有整數中,每個數碼 digit 各出現了多少次。輸入 1 99 輸出 9 20 20 20 20 20 20 20 20 20最近好像喜歡上數字dp了 這是乙個三維的dp 設 dp i j k 設從後往前填到第 i 位 這一位上的數字是 j k 這個數...