51Nod1042 數字0-9的數量(數位dp)
阿新 • • 發佈:2018-12-02
這道題剛開始我直接用暴力模擬,果斷超時了鴨,不開心!然後查了資料發現了數位dp演算法,看了一下午也沒看明白,又不開森!
直接用得了,哈!
數位dp演算法是直接算出來1到某個數之間各個位數字之和,結果存在陣列c裡面。
#include <iostream> #define ll long long using namespace std; void dfs(ll a,ll b,ll c[])//數位dp { ll n=a/10,m=a%10,t=n; for(int i=0;i<=m;i++) c[i]+=b;//當前位對低位的影響 for(int i=0;i<10;i++) c[i]+=b*n;//高位對低位的影響 c[0]-=b;//0特殊處理,將多算的0減去 while(t)//當前位對高位的影響 { c[t%10]+=b*(m+1);//加上0 t/=10; } if(n) dfs(n-1,b*10,c);//n已經處理過,所以要處理n-1 } ll x[20],y[20]; int main() { ll a,b; cin>>a>>b; dfs(a-1,1,x); dfs(b,1,y); for(int i=0;i<10;i++) cout<<y[i]-x[i]<<endl; }