【学习笔记】数位DP

数位DP

适用条件

此类题目一般要求在[l,r]区间内满足条件的数的个数,答案一般与数的大小无关,而与数各位的组成有关。题目中给出的数的范围一般较大,往往在109以上因此无法暴力枚举,只能使用动态规划

代码实现

使用记忆化搜索更简单易于理解。
从数的高位向低位搜索,每一位可以为09。但是注意当搜索到第i位时,如果前i1位已经是最大值时,那么当前的数也不能超过最值,即范围为

0a[i]

因此记忆化搜索函数需要两个参数。
1.cur表示当前位于第cur
2.lim表示前cur1是否已经全部达到最大值。limcur+1==1,当且仅当

limcur==1,i==max

因为题目要求[l,r]区间内满足条件的个数,由于个数满足区间可加性,因此可以用类似前缀和的方法来求。设calc(i)表示0i区间内的个数,那么答案就是calc(r)calc(l1)

ACcode

DFScode

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

初始化+calc code


int calc(int x){
	len=0;
	memset(f,-1,sizeof(f));
	while(x){
		a[++len]=x%10;
		x/=10;
	}
	return dfs(len,1);
}

posted @   GuoSN0410  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验
点击右上角即可分享
微信分享提示