BZOJ 1026 windy数 (数位DP)
题意
区间[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)相关推荐
- HYSBZ - 1026 windy数(数位dp)
题目链接:点击查看 题目大意:求a到b闭区间内满足相邻两个数字之差大于等于2的数字个数 分析:dp[i][j]表示第i位上数字为j的结果,pos表示位数,pre表示上一位数,lead表示是否有前导0, ...
- 洛谷 P2657 [SCOI2009] windy数 数位DP
大家觉得写还可以,可以点赞.收藏.关注一下吧! 也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn 文章目录 P2657 [SCOI2009 ...
- bzoj 1026: [SCOI2009]windy数 数位DP算法笔记
数位DP入门题之一 也是我所做的第一道数位DP题目 (其实很久以前就遇到过 感觉实现太难没写) 数位DP题目貌似多半是问从L到R内有多少个数满足某些限制条件 只要出题人不刻意去卡多一个$log$什么的 ...
- bzoj 1026 windy数
题目大意: 定义一种windy数:不含前导零且相邻两个数字之差至少为2的正整数被称为windy数 求在A和B之间,包括A和B,总共有多少个windy数 思路: 一眼数位dp 具体见注释 1 #incl ...
- 【bzoj1026】[SCOI2009]windy数 数位dp
题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 输入 包含两个整数 ...
- BZOJ1026 [SCOI2009]windy数 数位dp
欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1026 题目概括 求区间[A,B]中有多少数满足下面的条件. 条件:该数相邻两位之差不小于2. 题解 ...
- 题解 BZOJ1026 luogu P2657 [SCOI2009]windy数 数位DP
BZOJ & luogu 看到某大佬AC,本蒟蒻也决定学习一下玄学的数位$dp$ (以上是今年3月写的话(叫我鸽神$qwq$)) 思路:数位$DP$ 提交:2次 题解:(见代码) #inclu ...
- AcWing1083. Windy数(数位DP)题解
题目传送门 题目描述 Windy 定义了一种 Windy 数:不含前导零且相邻两个数字之差至少为 2 的正整数被称为 Windy 数. Windy 想知道,在 A 和 B 之间,包括 A 和 B,总共 ...
- WINDY数----数位dp
题目链接:https://ac.nowcoder.com/acm/problem/20268 题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数 ...
最新文章
- 【LeetCode】6.Z 字形变换
- 性能测试基本流程介绍(《软件性能测试过程详解与安全剖析》)
- 驱动框架3——在内核中添加或去除某个驱动
- Windows搭建SonarQube_Mysql
- [luogu2286][HNOI2004]宠物收养场【平衡树】
- RabbitMq学习笔记005---登录rabbitmq报错User can only log in via localhost
- poj3660 Cow Contest
- python函数isdisjoint方法_Python学习之---Python中的内置函数(方法)(更新中。。。)...
- WebAPP ViewPort iPhone5 黑边解决方案
- 串口与定时器的重要关系_单片机串口必备基础知识
- springMVC接受括号乱码
- honeywell Xenon 1900 usb
- 微信支付一面(C++后台)
- windows 即时贴_如何在Windows 10上使用即时贴
- 监控行业常见视频格式
- SRE工作手册——基础
- 笠翁对韵(全卷,珍藏版附注释)
- 华为3COMSOX法案IT内控实践
- Leetcode(24)——两两交换链表中的节点
- SPOJ的账号注册方法
热门文章
- 蓝桥杯--算法入门级题目及答案解析
- 数学--数论--原根(循环群生成元)
- [深度学习] 自然语言处理 --- Huggingface-Pytorch中文语言Bert模型预训练
- 如何理解拓扑排序算法(转)
- Spring Security-- 验证码功能的实现
- Windows7上安装TensorFlow——基于Docker镜像
- 卷积神经网络如何解释和预测图像
- openai-gpt_您可以使用OpenAI GPT-3语言模型做什么?
- C++初始编程及相关的问题总结
- Booting ARM Linux SMP on MPCore