[模板] 数位dp

数位dp

简介

数位dp指满足特定性质的数的计数, 如求 \([l, r]\) 区间内不含 \(2\) 的数的个数.

一般来说, 数位dp利用dfs解决, 有时状态数较多, 需要hash表优化.

模板:

// 求[l,r] 中各位数字之积为特定值(prod[])数的个数
ll dp[nsz][35][25][15][15];
ll dfs(int p,ll v,ll base,ll l,ll r){
    ll maxv=v+base-1;
    if(maxv<l||v>r)return 0;
    if(p==0)return !(prod[1]||prod[2]||prod[3]||prod[4]);
    ll &tmp=dp[p][prod[1]][prod[2]][prod[3]][prod[4]];
    if(l<=v&&maxv<=r&&~tmp)return tmp;
    ll res=0;
    base/=10;
    rep(i,(v!=0),9){
        bool ok=1;
        rep(j,1,4)ok&=(add[i][j]<=prod[j]);
        if(ok==0)continue;
        rep(j,1,4)prod[j]-=add[i][j];
        res+=dfs(p-1,v+i*base,base,l,r);
        rep(j,1,4)prod[j]+=add[i][j];
    }
    if(l<=v&&maxv<=r)tmp=res;
    return res;
}

例题

[西安交大附中集训] d8 self

猜你喜欢

转载自www.cnblogs.com/ubospica/p/10223868.html