[模板] 数位dp

Posted ubospica

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[模板] 数位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

以上是关于[模板] 数位dp的主要内容,如果未能解决你的问题,请参考以下文章

数位dp总结 之 从入门到模板

[模板] 数位dp

数位DP模板

数位dp

数位DP套路模板

数位DP套路模板