BZOJ 1833 數字計數 數字DP

2022-03-11 14:31:35 字數 957 閱讀 3702

題目鏈結

做的第一道數字dp題,聽說是最基礎的模板題,但還是花了好長時間才寫出來。。。。。

想深入了解下數字dp的請點這裡

先設dp陣列dp[i][j][k]表示數字是i,以j開頭的數k出現的次數

有數字dp的題一般都會用到字首陣列,題目要求我們求b-a這個區間裡各個數碼出現的次數,我們可以分別求出(0,b)和(0,a-1)然後相減即可

具體分析請看**,寫的還算詳細

1 #include 2

using

namespace

std;

3 typedef long

long

ll;4 ll dp[15][10][10

];5 ll ans[10];//

用來儲存每個數碼出現的次數

6 ll bin[15];//

表示i位數中數碼i出現的次數

7 ll d[15];//

這個用來儲存數的每一位

8void

rule()19}

20}21}

22void solve(ll x,int

flag)

30for(int i=1;i//

這一步是最高位為0的,這些數都不會受到x的上限限制,都可以直接加進來

31for(int j=1;j<=9;j++)35}

36int tmpt=cnt;

37while(cnt)43}

44 ans[d[cnt]]+=(tmpx%bin[cnt]+1)*flag;cnt--;//

隨著while迴圈,上限一步步的被處理

45 }//

簡述一下過程(456),就是第乙個for處理了0-399,然後把首位4的57次加上,第二個for,處理的0-49......就這樣一步步往下 46}

47int

main()

BZOJ 1833 count 數字計數 數字DP

description 給定兩個正整數a和b,求在 a,b 中的所有整數中,每個數碼 digit 各出現了多少次。input 輸入檔案中僅包含一行兩個整數a b,含義如上所述。output 輸出檔案中包含一行10個整數,分別表示0 9在 a,b 中出現了多少次。解題報告 這道題很容易看出是乙個數字d...

數字DP入門 BZOJ 1833 題解(需要複習)

顯然,這篇部落格受popoqqq的影響,自己敲了一遍,基本上和popoqqq的 一樣,在這裡寫一下題解 題目 time limit 3 sec memory limit 64 mb submit 3421 solved 1510 給定兩個正整數a和b,求在 a,b 中的所有整數中,每個數碼 digi...

BZOJ1833 count 數字計數

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