数位DP

小灰灰 2022-06-15 00:40 454阅读 0赞

Problem Description

据说,QAQ 的幸运数字是含有 “47” (4 和 7 相邻)的数,例如 47, 147, 247, 470, 471, 2047 是他的幸运数字,而 74, 1234, 407 就不是他的幸运数字。

而对 C~K 来说,只要不是 QAQ 的幸运数字的数都是他的幸运数字。那么他想问你,在闭区间 [l, r] 中,有多少个自己的幸运数字?

Input

输入数据有多组。第 1 行输入 1 个整数 T (1 <= T <= 10000) 表示数据组数。

对于每组数据,输入 1 行,包含 2 个整数 l, r (1 <= l <= r < 10^9),表示 C~K 要询问的区间。

Output

对于每组数据,在 1 行中输出 1 个整数,表示区间内 C~K 的幸运数字的个数。

Example Input

  1. 3
  2. 1 1
  3. 10 50
  4. 1 500

Example Output

  1. 1
  2. 40
  3. 485
  4. #include<stdio.h>
  5. #include<string.h>
  6. int digit[12];
  7. int dp[12][12];
  8. int dfs(int pos,int pre,int limit)
  9. {
  10. int i;
  11. int end;
  12. int ret=0;
  13. if(pos<0)
  14. {
  15. return 1;
  16. }
  17. if(!limit && dp[pos][pre]!=-1) //说明之前递归的时候进行过这一步
  18. {
  19. return dp[pos][pre];
  20. }
  21. end=limit?digit[pos]:9;
  22. for(i=0;i<=end;i++)
  23. {
  24. if(!(pre==4 && i==7)) //如果上一位不是4或者当前位不是7则不满足47的条件
  25. { //然后pos-1,开始检查下一位和当前位是不是构成47的条件
  26. ret+=dfs(pos-1,i,limit && i==end);
  27. }
  28. }
  29. if(!limit)
  30. dp[pos][pre]=ret;
  31. return ret;
  32. }
  33. int calcu(int n)
  34. {
  35. int i;
  36. i=0;
  37. while(n)
  38. {
  39. digit[i++]=n%10; //对n进行数位拆分,从低位到高位存放在digit数组中
  40. n/=10;
  41. }
  42. return dfs(i-1,0,1); //i-1是最高位存放的下标,0 是前一位的数 1表示前一位已经到达了上界,如果是0
  43. //代表没有到达上界
  44. }
  45. int main()
  46. {
  47. int t;
  48. int l,r;
  49. int count;
  50. scanf("%d",&t);
  51. memset(dp,-1,sizeof(dp));
  52. while(t--)
  53. {
  54. scanf("%d%d",&l,&r);
  55. count=calcu(r)-calcu(l-1);
  56. printf("%d\n",count);
  57. }
  58. return 0;
  59. }

发表评论

表情:
评论列表 (有 0 条评论,454人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数位DP 详解

    序 > 天堂在左,战士向右 引言 数位DP在竞赛中的出现几率极低,但是如果不会数位DP,一旦考到就只能暴力骗分。 以下是数位DP详解,涉及到的例题有:

    相关 数位dp小结

    数位dp小结 关于limit的问题 在数位dp中,limit的作用主要有两个。 控制枚举的界限,倘若没有界限,每一位的枚举范围都是0-9. 但如果有界限,

    相关 数位DP

    Problem Description 据说,QAQ 的幸运数字是含有 "47" (4 和 7 相邻)的数,例如 47, 147, 247, 470, 471, 2047

    相关 数位DP UVA - 11038

    数位DP,顾名思义,是在个位,十位,百位,千位…….这些数的数位上进行的DP,它其实就是一种暴力枚举+记忆化搜索。 数位DP一般用来解决要求找出某个区间内,满足要求的数有多

    相关 hdoj3709(数位dp

    题目链接:https://vjudge.net/problem/HDU-3709 题意:求出\[l,r\]中的平衡数,平衡数即存在一个中心点使得两边的力矩和相等。 思路:首