题目描述
Windy 定义了一种 Windy 数:不含前导零且相邻两个数字之差至少为2的正整数被称为 Windy 数。

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

输入
一行两个数,分别为A,B。
输出
输出一个整数,表示答案。
样例输入
样例输入 1
1 10 样例输入 2
25 50
样例输出
样例输出 1
9 样例输出 2
20
提示
20%的数据,满足1<=A<=B<=1e6;
100%的数据,满足1<=A<=B<=2e9。

又是一道裸的数位dp,但是应当注意,为了区分前导0和中间0的区别,我们将前导0看作11,
这样可以防止前导0后面不能放置1(因为差小于2),这样即可判断每一个0前面是否为前导0,若是,则该位为前导0
上代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define olinr return
#define _ 0
#define love_nmr 0;
using namespace std;
int digit[],dp[][],idx,a,b;
int DP(int pos,int statu,int limit)
{
if(!pos)return ;
if(!limit&&~dp[pos][statu])return dp[pos][statu];
int res=;
int end=limit?digit[pos]:;
for(int i=;i<=end;i++)
{
if(abs(statu-i)<)continue;//差为2
if(statu==&&i==)res+=DP(pos-,,limit&&i==end);//前导0
else res+=DP(pos-,i,limit&&i==end);
}
if(!limit)dp[pos][statu]=res;
return res;
}
int solve(int num)
{
memset(dp,-,sizeof dp);
memset(digit,,sizeof digit);
idx=;
int temp=num;
while(temp>)
{
digit[++idx]=temp%;
temp/=;
}
return DP(idx,,);
}
int main()
{
scanf("%d%d",&a,&b);
printf("%d",solve(b)-solve(a-));
olinr ~~(^_^)*love_nmr
}

最新文章

  1. JavaScript - 原型
  2. PHP运算符
  3. babel 解构赋值无法问题
  4. Linux-深入理解Socket异常
  5. web 开发前端学习
  6. Fiddler工具的基本功能
  7. cordova的android notify消息通知插件
  8. DISPLAY_ITEM built-in in Oracle D2k Forms
  9. (笔记)angular 单选选项卡
  10. 如何在 Windows Azure 的虚拟机 ubuntu 上面安装和配置 openVPN(二)
  11. iOS之上线被拒
  12. 计算机学院大学生程序设计竞赛(2015’12) 1005 Bitwise Equations
  13. 写书好累 &lt;HTTP抓包实战&gt;终于出版
  14. js 随机生成颜色值
  15. spark MLlib实现的基于朴素贝叶斯(NaiveBayes)的中文文本自动分类
  16. json接口返回值
  17. [CQOI2018]解锁屏幕
  18. RbbitMQ 的 python 实现方法
  19. 集合(从本部分开始涉及API)
  20. fio 磁盘性能

热门文章

  1. Java反射理解(五)-- 方法反射的基本操作
  2. 怎样解决在执行 vue init 时提示 &quot;vue : 无法加载文件&quot; 的问题?
  3. 谷歌浏览器禁用JS步骤
  4. Redis之各版本特性
  5. vue实现吸顶
  6. shell中$(( ))、$( )、``与${ }的区别详解
  7. Samba Server 的使用者帳號及密碼備份
  8. MyEclipse基本配置及优化【MyEclipse_10.7】
  9. C# 列表中查找大小比较
  10. linux常用命令(centos)