1. 程式人生 > >51Nod1042 數字0-9的數量(數位dp)

51Nod1042 數字0-9的數量(數位dp)

這道題剛開始我直接用暴力模擬,果斷超時了鴨,不開心!然後查了資料發現了數位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;
}