题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=2089

思路
一切都在代码注释中

AC代码

#include <cstdio>
#include <cstring>
#include <ctype.h>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <map>
#include <stack>
#include <set>
#include <list>
#include <numeric>
#include <sstream>
#include <iomanip>
#include <limits>#define CLR(a, b) memset(a, (b), sizeof(a))
#define pb push_backusing namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef pair<string, int> psi;
typedef pair<string, string> pss;
typedef pair <int, ll> pil;const double PI = acos(-1.0);
const double E = exp(1.0);
const double eps = 1e-8;const int INF = 0x3f3f3f3f;
const ll llINF = 0x3f3f3f3f3f3f3f3f;
const int maxn = 1e2 + 5;
const int MOD = 1e9;int dp[10][3];/**  状态0: dp[i][0] 长度为i 不含有不合格数字的个数    *  状态1: dp[i][1] 长度为i 最高位为2 不含有不合格数字的个数  *  状态2: dp[i][2] 长度为i 含有不合格数字的个数  *  扩展最高位: 意思是在当前长度下 在最高位的左边再加一位  比如说 X 表示 长度为i的所有数字 那么 2X 就表示 扩展最高位为2 长度为i的所有数字  实际上2X的长度为i + 1*/void init()
{CLR(dp, 0);dp[0][0] = 1, dp[0][1] = dp[0][2] = 0;for (int i = 1; i < 10; i++){dp[i][0] = dp[i - 1][0] * 9 - dp[i - 1][1]; //  加上之前长度为i - 1 状态为0 的所有数字  要筛去状态0 长度为i - 1 扩展最高位为4的所有数字 以及 状态1 长度i - 1 扩展最高位为6的所有数字dp[i][1] = dp[i - 1][0];//  状态转移的是 长度为i - 1 状态为0 的所有数字i的扩展最高位为2dp[i][2] = dp[i - 1][1] + dp[i - 1][0] + dp[i  - 1][2] * 10;// 加上长度为i - 1 状态1 扩展最高位为6 的所有数字  以及长度为i - 1 状态0 扩展最高位为4的所有数字 以及长度为i - 1 状态2 扩展最高位为0-9 的所有数字}
}int solve(int x)
{int bit[10];CLR(bit, 0);int pos = 0;int tmp = x;while (x){bit[++pos] = x % 10;x /= 10;}bit[pos + 1] = 0;bool flag = false;  // 标记当目前为止 枚举的高位中 有没有出现过4或者62  true 表示出现过 4 或者 62int ans = 0;  // ans 记录的是 所有不符合要求的数字  最后答案就是 x - ansfor (int i = pos; i >= 1; i--){ans += dp[i - 1][2] * bit[i];    // 每次先加上 长度为 i - 1 状态为 2 的所有数字if (flag)ans += dp[i - 1][0] * bit[i];// 如果 之前高位出现过 4 或者 62  那么 下面的所有数字实际上都是不符合的// 这个有点难理解 我刚开始也理解不了 // 其实我们是这样枚举的  比如一个数字 63294  我们可以拆成 60000 + 3000 + 200 + 90 + 4// 我们在枚举 60000 的时候 ans + dp[4][2] * 6  这个  * 6 实际上是 最高位为 0 - 5的时候 后续四位数的范围是(0000-9999) 的时候 也就是说 这个时候 我们往答案里面更新了 00000-59999 范围内的所有不符合要求的数字// 那么到下一位的时候 ans + dp[3][2] * 3  也就是 我们枚举了 60000-62999 范围内 所有不符合要求的数字// 再下一位 枚举的是 63000-63199 范围内 所有不符合要求的数字// 再下一位 枚举的是 63200-63289 范围内 所有不符合要求的数字// 再下一位 枚举的是 63290-63293 范围内 所有不符合要求的数字  显然可以发现 63294 这个数字是没有被枚举的 所在在之后 我们要对这个数字 进行判断 如果 这个数 不合理 ans 需要 + 1else{if (bit[i] > 4)ans += dp[i - 1][0];// 如果 高位没有出现4或者62 并且此时的最高位数字>4 那么需要 ans 需要加上最高位 为4 后面跟着的不符合要求的数字if (bit[i + 1] == 6 && bit[i] > 2)ans += dp[i][1];// 如果前一高位的数字是6 并且本次高位的数字> 2  那么 ans 需要加上 长度为i 状态为1 的所有数字if (bit[i] > 6)ans += dp[i - 1][1];// 如果本次的最高位> 6 那么 ans 需要加上 长度为i - 1 状态为1 的所有数字}if (bit[i] == 4 || (bit[i + 1] == 6 && bit[i] == 2))flag = true;// 用来判断 高位是否出现过4或者62 以及判断本数字是否是不合格的数字}if (flag)ans++;// 若本数字是不合格数字 需要加上return tmp - ans;
}int main()
{init();int n, m;while (scanf("%d%d", &n, &m), n || m)printf("%d\n", solve(m) - solve(n - 1));
}

转载于:https://www.cnblogs.com/Dup4/p/9433094.html

HDU - 2089 不要62 【数位DP】相关推荐

  1. HDU 2089 不要62 数位DP

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2089 题目描述: 给定一个区间, 让你求这个区间中所有不带62 或 4 的数的个数 解题思路: 很明 ...

  2. Hdu 2089-不要62 数位dp

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=2089 不要62 Time Limit: 1000/1000 MS (Java/Others)    Me ...

  3. HDU - 2089 不要62 【暴力打表】【数位DP】

    不要62 HDU - 2089 题意 求区间[n,m]之间有多少个数字不含4或者连续的62 解法1 由于数据范围是0~1e6,所以直接暴力判断每一位数字是否含有4或者62,然后求前缀和即可 #incl ...

  4. hdu 2089 不要62【数位dp】

    HDU 2089 求给定区间内不含62和4的数的个数. 数位dp入门.从这里我清楚了一些数位dp的用法.比如limit是判断是否达到上界,而且需要判断(!limit)..比如若题目要求不含11的个数, ...

  5. HDU 2089 不要62(数位DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意 求一个区间内,不出现4和连续的62的数的个数. 分析 可以暴力打表.也可以数位DP. 设: ...

  6. [HDU]2089不要62

    http://acm.hdu.edu.cn/showproblem.php?pid=2089 这道题跟Bomb(http://www.cnblogs.com/sjy123/p/3247731.html ...

  7. 不要62 ---数位DP

    题意:求m到n中不含62和4的数的个数. 题目链接 思路:数位dp模板求满足的数字或不满足的数字,刚学,就求不满足的数. #include<stdio.h> #include<str ...

  8. HDU 6156 Palindrome Function 数位DP

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6156 题目描述: 求L~R所有的数的l~r进制的f(x), f(x) = 当前进制 如果回文串, f ...

  9. hdu2089 不要62 数位dp

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

  10. HDU 2089 不要62

    杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).  杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障 ...

最新文章

  1. 查看tensorflow安装版本
  2. HDU-2086 A1 = ?
  3. 算法经典书籍--计算机算法的设计与分析
  4. 请不要轻易使用 is_numberic 加入存在E字母
  5. java配置文件放置到jar外_java相关:Spring Boot 把配置文件和日志文件放到jar外部...
  6. sketch里的ios控件_30个让你眼前一亮的iOS Swift UI控件!
  7. 洛谷P4092树——并查集
  8. SpringBoot 工程目录 整合mybatis-neo4j(注解类型)-增删改查
  9. 智慧景区项目建设方案之(票务管理详细介绍)
  10. kubernetes学习总结-9Kubernetes的存储机制
  11. 读书笔记 - 说话之道 - 2
  12. Fractional Fourier Image Transformer forMultimodal Remote Sensing Data Classification
  13. 树莓派——8、树莓派博通BCM2835芯片手册导读
  14. C. Product of Three Numbers
  15. 多线程和事务之Workaround
  16. seneca mysql_Package - seneca-mysql-store-ex
  17. Microsoft Edge浏览器下载文件乱码修复方法(二)
  18. 抖音运营新手,常踩的十个坑(你中招了吗?)
  19. python replace函数用法_python pandas replace函数
  20. 百度飞桨EasyDL图像分类:收费口车辆类型自动识别

热门文章

  1. linux下pfam使用方法,无root权限安装Pfam的笔记
  2. Day2-《青春有你2》选手信息爬取
  3. 市场经济下的“按劳分配”
  4. VIPS 98经济型漏电继电器
  5. C# 读取Excel转换为DataTable的几种常见方式及实现步骤
  6. 1.GSAP(专业的Web/JavaScript动画库)
  7. 成都python工作-成都Python学习哪家好 毕业可从事哪些工作
  8. flex 布局写出麻将一到九筒
  9. Phoenix FD(火凤凰全能流体动力学3Dmax插件)
  10. YOLOv5报错AssertionError:Label class 1 exceeds nc=1 in yolo/dataset.ymal Possible class labels are 0-0