【51Nod】1042 - 数字0-9的数量(数位dp & 递归)

63 篇文章 0 订阅
11 篇文章 1 订阅
这篇博客介绍了如何使用数位动态规划和递归方法解决数字0-9出现次数的问题。作者通过对比之前解决数字1个数的题目,阐述了当前问题的递归思路,并提到了解题过程中的难点和关键点,包括数字对低位、高位的影响以及高位对低位的影响。文章提供了具体的递归实现代码。
摘要由CSDN通过智能技术生成

点击打开题目

基准时间限制:1 秒 空间限制:131072 KB 分值: 10  难度:2级算法题
 收藏
 取消关注
给出一段区间a-b,统计这个区间内0-9出现的次数。
比如 10-19,1出现11次(10,11,12,13,14,15,16,17,18,19,其中11包括2个1),其余数字各出现1次。
Input
两个数a,b(1 <= a <= b <= 10^18)
Output
输出共10行,分别是0-9出现的次数
Input示例
10 19



以前有一个算数字1的个数,这两个挺像的,这个的递归思路基本上是模仿那个。

传送门:点击打开链接


看懂了那道题,再看这个。

虽然说思路差不多一样,但是我做这个的时候也是看了别人的题解的,因为绕进去确实有点晕。

每一个数字无非就三种影响关系:

①它对低位的影响

②它对高位的影响

③高位对低位的影响


然后在递归中实现这三种关系的计算即可:

代码:

#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;
#define CLR(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define LL long long
void dp(LL n , LL m , LL *c)
{
	LL x = n % 10;
	LL y = n / 10;
	for (int i = 0 ; i <= x ; i++)
		c[i] += m;		//当前位对低位的影响,每个都是0~9的范围 
	for (int i = 0 ; i <= 9 ; i++)
		c[i] += m * y;		//当前位对的高位影响(高位不为0,在上一个循环中算过) 
	c[0] -= m;		//排除前导0的情况
	LL t = y;
	while (t)		//高位对低位的影响,即都为最大限制数 
	{
		c[t % 10] += (x+1) * m;		//算上0
		t /= 10; 
	}
	if (y)
		dp(y-1 , m*10 , c);		//y值在上个while中算过,算下一个未限制数 
}
int main()
{
	LL r,l;
	LL a[10] = {0};
	LL b[10] = {0};
	scanf ("%lld %lld",&l,&r);
	dp(r , 1 , a);
	dp(l-1 , 1 , b);
	for (int i = 0 ; i <= 9 ; i++)
		printf ("%lld\n",a[i]-b[i]);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值