windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,
在A和B之间,包括A和B,总共有多少个windy数?
包含两个整数,A B。
一个整数
【输入样例一】 1 10 【输入样例二】 25 50
【输出样例一】 9 【输出样例二】 20
【数据规模和约定】
100%的数据,满足 1 <= A <= B <= 2000000000 。
比较经典的数位DP,用dp[i][j] 表示 i 为第一个数字为 j 的满足要求的数的个数。
#include <iostream>
#include <cstdio>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long LL;
double PI=acos(-1);
int dp[15][10];
int a[15];
void p(){
memset(dp,0,sizeof(dp));
for(int i=0;i<10;i++){
dp[1][i]=dp[0][i]=1;
}
for(int i=2;i<=10;i++){
for(int j=0;j<10;j++){
for(int k=0;k<10;k++){
if(abs(j-k)>=2){
dp[i][j]+=dp[i-1][k];
}
}
}
}
}
int solve(int n){
int ans=0,nn=n,len=0;
while(nn>0){
len++;
nn/=10;
}
memset(a,0,sizeof(a));
for(int i=1;i<=len;i++){
a[i]=n%10;
n/=10;
}
for(int i=1;i<len;i++){
for(int j=1;j<10;j++){
ans+=dp[i][j];
}
}
for(int i=1;i<a[len];i++){
ans+=dp[len][i];
}
for(int i=len-1;i>0;i--){
for(int j=0;j<a[i];j++){
if(abs(j-a[i+1])>=2){
ans+=dp[i][j];
}
}
if(abs(a[i]-a[i+1])<2){
break;
}
}
return ans;
}
int main()
{
p();
int n,m;
while(~scanf("%d%d",&n,&m)){
printf("%d\n",solve(m+1)-solve(n));
}
return 0;
}