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;
}
还是要勤加练习啊。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)