题目描述

windy定义了一种windy数。

不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。

windy想知道,在A和B之间,包括A和B,总共有多少个windy数。

输入

输入文件包含两个整数,A,B。

输出

输出文件包含一个整数。

样例输入

1 10

样例输出

9

提示

20%的数据,满足1<=A<=B<=1000000

100%的数据,满足1<=A<=B<=2000000000

题解

这题的要注意的是1-9都是算作windy数,所以给最初的pre赋值233,使得这几个数的相邻两位之差必定大于2。然后这题的dfs多了一个判断前导零的参数lead,当前导零存在时也不能return或者更新dp[pos][pre],然后再将约束条件改为当前位和上一位的差值<2时continue即可。

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
long long int n,m;
int a[20],dp[20][10];//a用来存放数字的每位数
int dfs(int pos,int pre,bool limit,bool lead)//lead用来表示前导零的情况
{if(pos==0)return 1;if(!limit&&dp[pos][pre]!=-1&&!lead)return dp[pos][pre];int ans=0;int up=limit?a[pos]:9;for(int i=0;i<=up;i++){if(abs(i-pre)<2)continue;int p=i;if(lead&&i==0)p=-233;ans+=dfs(pos-1,p,i==a[pos]&&limit,p==-233);/*从数字的高位向低位递归,新limit的取值根据原limit和i的取值决定,例如246,当pos表示十位数时,如果原limit=1(即百位数=2)并且十位数等于4,那么下一次的搜索就会有限制(新limit=1 个位数上界限制为6)*/}if(!limit&&!lead)dp[pos][pre]=ans;return ans;
}int solve(int x)
{int pos=0;//pos用于记录当前位数while(x){a[++pos]=x%10;//pos从开始表示位数从个位到高位x/=10;//如在数组中的存放方式是4 2}return dfs(pos,-233,1,1);//从数字的最高位开始,pre初始为-233是为了保证只有一位数的数字能够被取到
}int main()
{while(cin>>n>>m){memset(dp,-1,sizeof(dp));cout<<solve(m)-solve(n-1)<<endl;//减的是n-1不是n,n自身要算进去}return 0;
}

【数位DP】Windy数相关推荐

  1. 数位DP --Windy数

    满足一下条件的数字称为windy数 不考虑前导0,所有相邻的两个数字的差至少为2. 求出任意区间内的所有windy数 思路:dp[i][j]表示所有长度为 i 的数字以 j 开头的windy数的个数. ...

  2. Good Bye 2017 G. New Year and Original Order 数位dp + 按数贡献

    传送门 文章目录 题意: 思路: 题意: 定义S(k)S(k)S(k)为将kkk的每一位拿出来从小到大排序后构成的数,比如S(3421)=1234S(3421)=1234S(3421)=1234,求S ...

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

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

  4. uestc 250 windy数(数位dp)

    题意:不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 思路:数位dp #include<iostream ...

  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】windy数,数位DP

    Time:2016.08.14 Author:xiaoyimi 转载注明出处谢谢 思路: 依旧蛋疼的数位DP f[i][j]表示有i位,且最高位为j的windy数个数 转移方程比较好写 关键是具体求值 ...

  8. 洛谷2657 windy数(数位DP)

    传送门 [题目分析] 数位DP经典题了. 考虑直接统计R内的windy数和L-1内的windy数,两者相减即为L~R之间的windy数. 考虑DP,记录当前位以及上一位所填的数,当前是否前面为前导零, ...

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

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

  10. bzoj 1026: [SCOI2009]windy数(数位dp)

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 7688  Solved: 3470 [Submit][S ...

最新文章

  1. 日志查看工具 linux,用 Logwatch 工具查看 Linux 系统 Log 日志
  2. 第十二届蓝桥杯JavaB组省赛H题 杨辉三角形
  3. moosefs mysql_moosefs搭建与应用
  4. Windows Store App 获取文件及文件夹列表
  5. 语言速算24点的小窍门_4秒钟1道题!12岁少年三夺24点大赛冠军
  6. ld: library not found for -lcrt1.3.1.o
  7. 概率与计算机论文,数学概率统计论文范文
  8. win64 安装Oracle 11g
  9. 网站速度优化模块HttpCompressionModule
  10. U盘检测及量产工具大合集
  11. 概率论中 Var是什么意思?概率论方差概念介绍
  12. 使用Wagtail一段时间后的感受
  13. html在线随机出题系统,出题系统/考试模拟考试系统-在线系统
  14. ip 查找计算机,win10系统通过ip地址查找计算机名的详细技巧
  15. 用python画钢铁侠图片_Photoshop快速把钢铁侠图片转为素描水墨风格教程
  16. php微信生成微信公众号二维码扫描进入公众号带参数
  17. EXCEL2016学生表两列名字按相同排序,对比期中期末考试选出进步学生
  18. 抖音小店为什么没生意?万顿思教育
  19. sklearn之逻辑回归LR
  20. 微服务网关Gateway(七)

热门文章

  1. 【强大的PDF格式转换工具】Lighten PDF Converter OCR for Mac 6.2.0
  2. adb命令查看手机电池信息
  3. 【青少年编程】【二级】小瓢虫找妈妈
  4. 腾讯消消乐 状压dp加普通dp
  5. 微软云游戏服务器,微软:云游戏服务Project xCloud将扩展游戏服务的数量和地区...
  6. Unity 3D模型展示之自由观察模型
  7. C#语言实例源码系列-异或算法加密解密
  8. Oracle使用游标更新数据 Oracle游标之select for update和where current of 语句
  9. centos 虚拟机输入大小写混乱问题
  10. RT-Thread Studio 项目实战教程 | 快速打造一个桌面mini网络时钟