題目鏈結
做的第一道數字dp題,聽說是最基礎的模板題,但還是花了好長時間才寫出來。。。。。
想深入了解下數字dp的請點這裡
先設dp陣列dp[i][j][k]表示數字是i,以j開頭的數k出現的次數
有數字dp的題一般都會用到字首陣列,題目要求我們求b-a這個區間裡各個數碼出現的次數,我們可以分別求出(0,b)和(0,a-1)然後相減即可
具體分析請看**,寫的還算詳細
1 #include 2using
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...