題目描述
不含前導零且相鄰兩個數字之差至少爲2的正整數被稱爲windy數。問在A和B之間,包括A和B,總共有多少個windy數?
題目分析
之前做了一道板題後再做這道感到愉悅多了。
一樣的套路,分解一下題目
首先當數的位數小於x時,可以隨便取值,我們不妨設
當位數和x相等時,
需要注意的是當
又及,這麼算出來的因爲每一次都不達到上界,是
代碼
/**************************************************************
Problem: 1026
User: szpszp
Language: C++
Result: Accepted
Time:4 ms
Memory:1288 kb
****************************************************************/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define MAXN
#define MAXM
#define INF 0x3f3f3f3f
typedef long long int LL;
template<class T>
void Read(T &x){
x=0;char c=getchar();bool flag=0;
while(c<'0'||'9'<c){if(c=='-')flag=1;c=getchar();}
while('0'<=c&&c<='9'){x=x*10+c-'0';c=getchar();}
if(flag)x=-x;
}
int dp[12][10];
int num[12];
int len;
void getnum(int x){
len=0;
while(x)num[++len]=x%10,x/=10;
}
int Solve(int x){
getnum(x);
int rn=0;
for(int i=1;i<len;++i)
for(int j=1;j<10;++j)rn+=dp[i][j];
for(int j=1;j<num[len];++j)rn+=dp[len][j];
for(int i=len-1;i>=1;--i){
for(int j=0;j<num[i];++j)
if(abs(num[i+1]-j)>=2)rn+=dp[i][j];
if(abs(num[i+1]-num[i])<2)break;
}
return rn;
}
void init(){
for(int i=0;i<10;++i)dp[1][i]=1;
for(int i=2;i<12;++i)
for(int j=0;j<10;++j){
dp[i][j]=0;
for(int k=0;k<10;++k)
if(abs(j-k)>=2)dp[i][j]+=dp[i-1][k];
}
}
int main(){
init();
int l,r;
Read(l),Read(r);
printf("%d\n",Solve(r+1)-Solve(l));
}