题意

区间[A,B]上,总共有多少个不含前导零且相邻两个数字之差至少为2的正整数?

思路

状态设计非常简单,只需要pos、limit和一个前驱数pre就可以了,每次枚举当前位时判断是否与上一位相差2即可。一个需要注意的地方是第一位不用比较,所以我们还需要一个flag标志记录当前pos位是不是第一位。

代码

[cpp] #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <string> #include <cstring> #include <vector> #include <set> #include <stack> #include <queue> #define MID(x,y) ((x+y)/2) #define MEM(a,b) memset(a,b,sizeof(a)) #define REP(i, begin, m) for (int i = begin; i < begin+m; i ++) using namespace std; typedef long long LL; typedef vector <int> VI; typedef set <int> SETI; typedef queue <int> QI; typedef stack <int> SI; const int oo = 0x7fffffff; int dp[12][10][2]; VI num; int dfs(int pos, int pre, bool flag, int limit){ if (pos == -1) return 1; if (!limit && ~dp[pos][pre][flag]) return dp[pos][pre][flag]; int end = limit?num[pos]:9, res = 0; for (int i = 0; i <= end; i ++){ if (flag || abs(i - pre) >= 2){ res += dfs(pos-1, i, flag&&(i == 0),limit&&(i==end)); } } return limit?res:dp[pos][pre][flag] = res; } int cal(int x){ num.clear(); while(x){ num.push_back(x%10); x /= 10; } return dfs(num.size()-1, 0, 1, 1); } int main(){ int a,b; MEM(dp, -1); while(scanf("%d %d", &a, &b) != EOF){ printf("%d\n", cal(b)-cal(a-1)); } return 0; } [/cpp]

转载于:https://www.cnblogs.com/AbandonZHANG/p/4114315.html

BZOJ 1026 windy数 (数位DP)相关推荐

  1. HYSBZ - 1026 windy数(数位dp)

    题目链接:点击查看 题目大意:求a到b闭区间内满足相邻两个数字之差大于等于2的数字个数 分析:dp[i][j]表示第i位上数字为j的结果,pos表示位数,pre表示上一位数,lead表示是否有前导0, ...

  2. 洛谷 P2657 [SCOI2009] windy数 数位DP

    大家觉得写还可以,可以点赞.收藏.关注一下吧! 也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn 文章目录 P2657 [SCOI2009 ...

  3. bzoj 1026: [SCOI2009]windy数 数位DP算法笔记

    数位DP入门题之一 也是我所做的第一道数位DP题目 (其实很久以前就遇到过 感觉实现太难没写) 数位DP题目貌似多半是问从L到R内有多少个数满足某些限制条件 只要出题人不刻意去卡多一个$log$什么的 ...

  4. bzoj 1026 windy数

    题目大意: 定义一种windy数:不含前导零且相邻两个数字之差至少为2的正整数被称为windy数 求在A和B之间,包括A和B,总共有多少个windy数 思路: 一眼数位dp 具体见注释 1 #incl ...

  5. 【bzoj1026】[SCOI2009]windy数 数位dp

    题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 输入 包含两个整数 ...

  6. BZOJ1026 [SCOI2009]windy数 数位dp

    欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1026 题目概括 求区间[A,B]中有多少数满足下面的条件. 条件:该数相邻两位之差不小于2. 题解 ...

  7. 题解 BZOJ1026 luogu P2657 [SCOI2009]windy数 数位DP

    BZOJ & luogu 看到某大佬AC,本蒟蒻也决定学习一下玄学的数位$dp$ (以上是今年3月写的话(叫我鸽神$qwq$)) 思路:数位$DP$ 提交:2次 题解:(见代码) #inclu ...

  8. AcWing1083. Windy数(数位DP)题解

    题目传送门 题目描述 Windy 定义了一种 Windy 数:不含前导零且相邻两个数字之差至少为 2 的正整数被称为 Windy 数. Windy 想知道,在 A 和 B 之间,包括 A 和 B,总共 ...

  9. WINDY数----数位dp

    题目链接:https://ac.nowcoder.com/acm/problem/20268 题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数 ...

最新文章

  1. 【LeetCode】6.Z 字形变换
  2. 性能测试基本流程介绍(《软件性能测试过程详解与安全剖析》)
  3. 驱动框架3——在内核中添加或去除某个驱动
  4. Windows搭建SonarQube_Mysql
  5. [luogu2286][HNOI2004]宠物收养场【平衡树】
  6. RabbitMq学习笔记005---登录rabbitmq报错User can only log in via localhost
  7. poj3660 Cow Contest
  8. python函数isdisjoint方法_Python学习之---Python中的内置函数(方法)(更新中。。。)...
  9. WebAPP ViewPort iPhone5 黑边解决方案
  10. 串口与定时器的重要关系_单片机串口必备基础知识
  11. springMVC接受括号乱码
  12. honeywell Xenon 1900 usb
  13. 微信支付一面(C++后台)
  14. windows 即时贴_如何在Windows 10上使用即时贴
  15. 监控行业常见视频格式
  16. SRE工作手册——基础
  17. 笠翁对韵(全卷,珍藏版附注释)
  18. 华为3COMSOX法案IT内控实践
  19. Leetcode(24)——两两交换链表中的节点
  20. SPOJ的账号注册方法

热门文章

  1. 蓝桥杯--算法入门级题目及答案解析
  2. 数学--数论--原根(循环群生成元)
  3. [深度学习] 自然语言处理 --- Huggingface-Pytorch中文语言Bert模型预训练
  4. 如何理解拓扑排序算法(转)
  5. Spring Security-- 验证码功能的实现
  6. Windows7上安装TensorFlow——基于Docker镜像
  7. 卷积神经网络如何解释和预测图像
  8. openai-gpt_您可以使用OpenAI GPT-3语言模型做什么?
  9. C++初始编程及相关的问题总结
  10. Booting ARM Linux SMP on MPCore