【学习笔记】数位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 IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!