【学习笔记】数位DP
数位DP
适用条件
此类题目一般要求在区间内满足条件的数的个数,答案一般与数的大小无关,而与数各位的组成有关。题目中给出的数的范围一般较大,往往在以上因此无法暴力枚举,只能使用动态规划
代码实现
使用记忆化搜索更简单易于理解。
从数的高位向低位搜索,每一位可以为。但是注意当搜索到第位时,如果前位已经是最大值时,那么当前的数也不能超过最值,即范围为
因此记忆化搜索函数需要两个参数。
1.表示当前位于第位
2.表示前是否已经全部达到最大值。若,当且仅当
因为题目要求区间内满足条件的个数,由于个数满足区间可加性,因此可以用类似前缀和的方法来求。设表示区间内的个数,那么答案就是
int dfs(int x,bool lim){
if(x<=0)return 1;
if(!lim&&f[x]!=-1)return f[x];
int up=lim?a[x]:9;
int ans=0;
for(int i=0;i<=up;i++){
if(i!=4)ans+=dfs(x-1,lim&&(i==up));
}
if(!lim)f[x]=ans;
return ans;
}
初始化+
int calc(int x){
len=0;
memset(f,-1,sizeof(f));
while(x){
a[++len]=x%10;
x/=10;
}
return dfs(len,1);
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验