HDU 4389 数位dp
HDU 4389 (数位dp)
题意
求一个区间内[L,R] 内 有多少个 数满足:它的数位和能整除它本身。
思路
按照一般数位dp的套路,多出来的参数无非就是数位和以及这个数本身,但如果直接这样做会发现一个问题:每增加一位,数位和就会发生变化,所以还要添加一个参数mod作为最终的数位和,在外层枚举数位和就行了,因为数据范围在1e9 ,数位和最多为81。
int f[11][82][82][82];//不要开多,因为真的会MLE
//当前位置,外层枚举的最终数位和,当前数%最终数位和,当前累计数位和,上限限制
int dfs(int pos,int mod,int num,int tot,int limit)
{
if(!pos)
{
return num==0&&tot==mod;
}
if(!limit&&f[pos][mod][num][tot]!=-1) return f[pos][mod][num][tot];
int up=limit?a[pos]:9,sum=0;
for(int i=0;i<=up;i++)
{
sum+=dfs(pos-1,mod,(num*10+i)%mod,tot+i,limit&&(i==up));
}
if(!limit) f[pos][mod][num][tot]=sum;
return sum;
}
还是要勤加练习啊。