[模板] 数位dp

时间:2023-03-09 23:01:08
[模板] 数位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