windy数
题目描述
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,
在A和B之间,包括A和B,总共有多少个windy数?
输入输出格式
输入格式:
包含两个整数,A B。
输出格式:
一个整数
输入输出样例
输入样例#1:
1 10
输出样例#1:
9
输入样例#2:
25 50
输出样例#2:
20
说明
100%的数据,满足 1 <= A <= B <= 2000000000 。
题意 首先是要去掉前导零,然后相邻的两数字之差至少为2(>=2)
前导零是啥意思呢 就是 1-10 他从高位开始枚举 没有的用零来凑
例如 01 02 03 04 .。。。 10
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <math.h>
#include <cstring>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <stdlib.h>
#include <list>
#include <map>
#include <utility>
#include <time.h>
#include <set>
#include <bitset>
#include <vector>
#define pi acos(-1.0)
#define inf 0x3f3f3f3f
#define linf 0x3f3f3f3f3f3f3f3f
#define ms(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define ll long long
const int maxn=1e5+5;
using namespace std;
ll temp[15];
ll dp[15][15];
ll dfs(int cnt,int state,int lead,int limit)
{
if(cnt==-1) return 1;
if(!limit && !lead && dp[cnt][state]!=-1) return dp[cnt][state];
int up=limit?temp[cnt]:9;
ll ans=0;
for(int i=0;i<=up;i++)//枚举当前位的数
{
if((!lead && abs(i-state)>=2 )|| lead)
ans+=dfs(cnt-1,i,lead && i==0,limit && i==temp[cnt]);
}
if(!limit && !lead)dp[cnt][state]=ans;
return ans;
}
ll solve(ll x)
{
int cnt=0;
while(x)
{
temp[cnt++]=x%10;
x/=10;
}
return dfs(cnt-1,0,1,1);
}
int main()
{
ll a,b;
scanf("%lld%lld",&a,&b);
ms(dp,-1);
printf("%lld\n",solve(b)-solve(a-1));
return 0;
}