沒啥好說的,裸裸的數字\(dp\)。
先列舉當前是算數字\(x\)出現的次數,設\(f_\)表示從高位往低位\(dp\),\(dp\)完了前\(i\)位之後\(x\)出現了\(j\)次的方案數。然後再加一維,表示當前這一位能否自由選數(也就是說之前是否是一路選最大值過來的)。轉移分情況討論一下就好了。
注意這種寫法還有一點情況,就是算\(0\)出現的次數時需要減去區間內前導\(0\)的個數。
下面貼**:
#include#include#include#include#include#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)using namespace std;
typedef long long llg;
llg l,r,f[21][21][2],mi[21];
int a[21],b[21],l1,l2;
void divide(llg x,int *s,int &len)
llg work(int *s,int n,int x)
else f[i][j][0]+=f[i-1][j][1]*s[i];
if(s[i]==x)
else f[i][j][1]=f[i-1][j][1];
} llg now=0;
for(int i=1;i<=n;i++) now+=i*(f[n][i][0]+f[n][i][1]);
if(!x)
return now;
}int main()
return 0;
}
BZOJ1833 count 數字計數
題目描述 給定兩個正整數a和b,求在 a,b 中的所有整數中,每個數碼 digit 各出現了多少次。輸入輸入檔案中僅包含一行兩個整數a b,含義如上所述。輸出輸出檔案中包含一行10個整數,分別表示0 9在 a,b 中出現了多少次。樣例輸入 1 99樣例輸出 9 20 20 20 20 20 20 2...
BZOJ 1833 count 數字計數
題目描述 給定兩個正整數a和b,求在 a,b 中的所有整數中,每個數碼 digit 各出現了多少次。輸入輸入檔案中僅包含一行兩個整數a b,含義如上所述。輸出輸出檔案中包含一行10個整數,分別表示0 9在 a,b 中出現了多少次。樣例輸入 1 99樣例輸出 9 20 20 20 20 20 20 2...
BZOJ 1833 數字計數 數字DP
題目鏈結 做的第一道數字dp題,聽說是最基礎的模板題,但還是花了好長時間才寫出來。想深入了解下數字dp的請點這裡 先設dp陣列dp i j k 表示數字是i,以j開頭的數k出現的次數 有數字dp的題一般都會用到字首陣列,題目要求我們求b a這個區間裡各個數碼出現的次數,我們可以分別求出 0,b 和 ...