题目描述
原题题面
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 。
【AC代码】:
#include<bits/stdc++.h>
#define M(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define MOD 1000000009
using namespace std;
inline void read(int &x){
char ch=getchar(),c=ch;
x=0;
while(ch<'0' || ch>'9'){
c=ch;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
if(c=='-')x=-x;
}
int A,B,i,j,k;
int dp[15][15],a[15];
int work(int x){
memset(a,0,sizeof(a));
int len=0,ans=0;
while(x){
a[++len]=x%10;
x/=10;
}
for(i=1;i<=len-1;i++)
for(j=1;j<=9;j++)
ans+=dp[i][j];
for(i=1;i<a[len];i++)ans+=dp[len][i];
for(i=len-1;i>=1;i--){
for(j=0;j<=a[i]-1;j++)if(abs(j-a[i+1])>=2)ans+=dp[i][j];
if(abs(a[i+1]-a[i])<2)break;
}
return ans;
}
int main(){
for(i=0;i<=9;i++)dp[1][i]=1;
for(i=2;i<=10;i++)
for(j=0;j<=9;j++)
for(k=0;k<=9;k++)
if(abs(j-k)>=2) dp[i][j]+=dp[i-1][k];
read(A),read(B);
printf("%d\n",work(B+1)-work(A));
return 0;
}