题目链接

题意:问区间[n,m]中,不含数字4,也不含数字串“62”的所有数的个数。

思路:可以转化成求区间[0,x]

第一次接触数位dp,参考了这几篇博客。

不要62(数位dp)解题报告

解题报告2

解题报告3

比较重要的前提:

**¨对于一个小于n的数,肯定是从高位到低位出现某一位

¨如 n = 58 n为十进制数。

**¨ x = 49 此时x的十位

**¨ x = 51 此时x的个位

**¨有了上述性质,我们就可以从高到低枚举第一次

这样之前的位确定了,之后的位就不受n的限制即从00…0~99…9,可以先预处理

以及写成递归形式代码会简洁很多,所以就写了递归形式。

更详细的解释参加代码注释。

  1. #include<bits/stdc++.h>
  2. #define fst first
  3. #define sec second
  4. #define lson l,m,rt<<1
  5. #define rson m+1,r,rt<<1|1
  6. #define ms(a,x) memset(a,x,sizeof(a))
  7. typedef long long LL;
  8. #define pi pair < int ,int >
  9. #define MP make_pair
  10. using namespace std;
  11. const double eps = 1e-8;
  12. const int dx[4] = { 1,0,0,-1 };
  13. const int dy[4] = { 0,1,-1,0 };
  14. const int inf = 0x3f3f3f3f;//1061109567
  15. int n, m;
  16. int dp[30][2];
  17. int digit[30];
  18. int dfs(int pos, bool preis6, bool limit) {//pos表示从低到高的第几位,是从高位往低位递归的(也就是从左到又)
  19. // preis6 表示上一个数字是否为6,
  20. // limit表示该位置是否有限制。
  21. //cout<<pos<<" "<<preis6<<" "<<limit<<" "<<endl;
  22. if (!pos)return 1;//到该位置表明找到了一个解.
  23. int res = 0;
  24. //如果不是limit位置,表示结果是通用的,而之前又算过的话,就可以直接调用这个结果。
  25. if (!limit && dp[pos][preis6] != -1)return dp[pos][preis6];
  26. //mx第pos位置能取到的最大的数字..如果不是limit,则可以0..9任意取。
  27. int mx = limit ? digit[pos] : 9;
  28. //cout<<"mx:"<<mx<<endl;
  29. for (int i = 0; i <= mx; i++)
  30. {
  31. if (i == 4 || (i == 2 && preis6)) continue;
  32. res += dfs(pos - 1, i == 6, limit&&i == mx);
  33. //(limit&&i==mx)中limit的含义是。。如果当前一位不是limit位(即0..9可以随便取的位置)
  34. //,那么之后的位置也一定不是limit位置。
  35. //而i==mx部分的意思是,在当前位置的数字小于当前位置的数字能取的最大值(mx)之前,
  36. //后面位的数字随便取也不会超过上界。
  37. }
  38. if (!limit) dp[pos][preis6] = res; //记忆化. 非limit位的结果才通用,不然没必要存。
  39. return res;
  40. }
  41. int solve(int n) {
  42. ms(digit, 0);
  43. int len = 0;
  44. //将数按照每一位存到digit数组中
  45. while(n) {
  46. digit[++len] = n % 10;
  47. n /= 10;
  48. }
  49. return dfs(len, false, true);
  50. }
  51. int main() {
  52. ios::sync_with_stdio(false);
  53. while (cin >> n >> m && n&& m) {
  54. ms(dp, -1);
  55. int ans = solve(m) - solve(n - 1);
  56. cout << ans << endl;
  57. }
  58. return 0;
  59. }

#2089: 不要62 (数位dp模板题,附带详细解释)的更多相关文章

  1. HDU 2089 不要62 数位DP模板题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 参考博客:https://www.cnblogs.com/HDUjackyan/p/914215 ...

  2. HDU 2089 - 不要62 - [数位DP][入门题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...

  3. hdu 2089 不要62 (数位dp基础题)

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. HDU 2089 不要62(数位dp模板题)

    http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求区间内不包含4和连续62的数的个数. 思路: 简单的数位dp模板题.给大家推荐一个好的讲解博客.h ...

  5. HDU 2089 不要62(数位DP&#183;记忆化搜索)

    题意  中文 最基础的数位DP  这题好像也能够直接暴力来做   令dp[i][j]表示以 j 开头的 i 位数有多少个满足条件 那么非常easy有状态转移方程 dp[i][j] = sum{ dp[ ...

  6. [hdu 2089] 不要62 数位dp|dfs 入门

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求[n, m]区间内不含4和62的数字个数. 这题有两种思路,直接数位dp和dfs 数位d ...

  7. Hdu 2089 不要62 (数位dp入门题目)

    题目链接: Hdu 2089 不要62 题目描述: 给一个区间 [L, R] ,问区间内不含有4和62的数字有多少个? 解题思路: 以前也做过这个题目,但是空间复杂度是n.如果数据范围太大就GG了.今 ...

  8. 【hdu6148】Valley Numer【数位dp模板题】

    题意 对于每组数据给出一个整数n(length(n)<=100),找出不大于n的数字中有多少是Valley Numer.对于Valley的定义是它每一位的数字要么是递增,要么是递减,要么是先递减 ...

  9. 51nod 1009 - 数字1的数量 - [数位DP][模板的应用以及解释]

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009 基准时间限制:1 秒 空间限制:131072 KB 给 ...

  10. hdu 2089 不要62 数位dp

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

随机推荐

  1. 黑客玩具入门——2、Kali常用命令与简单工具

    一.Linux常用命令 首先,我们启动kali系统,然后点击这里的命令行工具. 就可以使用下面学习的命令了,另外,如果你有过计算机基础,那么Mac的terminal和Git的gitbash,都是可以练 ...

  2. MINA框架

    一.小程序MINA框架分为三个部分: 有 View(视图层).App Service(逻辑层)和 Natice(系统层). 1.View(视图层) 视图层包含了小程序多个页面.每个页面都有WXML文件 ...

  3. 0x02.加密和编码

    识别算法编码类型 看密文位数 看密文特征(数字.字母.大小写.符号等) 看当前密文存在的地方(web.数据库.操作系统等) 密码存储加密 md5:16位和32位由0-9和a-f组成的字符串 ,该加密方 ...

  4. 开发必备工具、插件【ME】

    工欲善其事,必先利其器,记录自己开发中常用的工具.插件:  慢慢更新... 一.必备 1.Visual Studio.IntelliJ IDEA .Sublime Text 3 2.TeamViewe ...

  5. liunx系统登录有趣界面图案

    # vim /etc/motd .::::. .::::::::. ::::::::::: ..:::::::::::' '::::::::::::' .:::::::::: '::::::::::: ...

  6. GHOST 系统安装教程 轻松一键,系统恢复到最佳状态

    硬盘安装系统 安装前准备 1.保证能够正常进入系统: 2.下载Ghost系统镜像文件: 3.下载镜像安装器: 安装步骤 1.下载Ghost系统镜像"Win7_x64_Pure_5.07.GH ...

  7. HDU-2586 How far away?

    There are n houses in the village and some bidirectional roads connecting them. Every day peole alwa ...

  8. 微软官方发布的C#开源、免费、实用的Windows工具箱

    前言 今天分享一款由微软官方发布的C#开源.免费.实用的Windows工具箱(帮助用户调整和简化Windows系统的体验,从而提高工作效率):Microsoft PowerToys. 项目介绍 Mic ...

  9. 搭建vulfocus靶场

    搭建vulfocus靶场 第一种方法 docker pull一下执行如下命令即可 docker pull vulfocus/vulfocus:latest docker run -d -p 8081: ...

  10. 聊聊 从源码来看ChatGLM-6B的模型结构

    基于ChatGLM-6B第一版,要注意还有ChatGLM2-6B以及ChatGLM3-6B 概述 ChatGLM是transformer架构的神经网络模型,因此从transformer结构入手,分析其 ...