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;
}

还是要勤加练习啊。

posted @ 2023-02-12 10:25  Liang2003  阅读(11)  评论(0编辑  收藏  举报