Description
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在A和B之间,包括A和B,总共有多少个windy数?
Input
包含两个整数,A B。
Output
一个整数。
Sample Input
【输入样例一】
1 10
【输入样例二】
25 50
1 10
【输入样例二】
25 50
Sample Output
【输出样例一】
9
【输出样例二】
20
9
【输出样例二】
20
HINT
【数据规模和约定】
100%的数据,满足 1 <= A <= B <= 2000000000 。
数位DP,f[i][j]表示一共有i位最高位为j共有多少个符合条件的值
1 #include<cstdio> 2 #include<cmath> 3 using namespace std; 4 int base[11],f[11][11],a,b; 5 void pre(){ 6 base[1]=1; 7 for(int i=2;i<=10;i++) base[i]=base[i-1]*10;//base代表这一位有多少数字 8 for(int i=0;i<=9;i++)f[1][i]=1;//f[i][j]代表有i位第一位为j的有多少个 9 for(int i=2;i<=10;i++) 10 for(int j=0;j<=9;j++) 11 for(int k=0;k<=9;k++) 12 if(fabs(j-k)>=2) f[i][j]+=f[i-1][k]; 13 14 } 15 16 int calc(int x){ 17 if(!x) return 0; 18 int w=10,ans=0; 19 while(base[w]>x)w--; 20 int cur=x/base[w];//x的第一位 21 for(int i=1;i<w;i++) 22 for(int j=1;j<=9;j++) ans+=f[i][j];//why? 23 for(int i=1;i<cur;i++) ans+=f[w][i]; 24 x%=base[w]; 25 int pre=cur; 26 for(int i=w-1;i;i--){ 27 cur=x/base[i]; 28 if(i>1){ 29 for(int j=0;j<cur;j++)if(fabs(j-pre)>=2) ans+=f[i][j]; 30 } 31 else{ 32 for(int j=0;j<=cur;j++) if(fabs(j-pre)>=2) ans+=f[i][j]; 33 } 34 if(fabs(cur-pre)<2) break; 35 x%=base[i]; 36 pre=cur; 37 } 38 return ans; 39 } 40 41 int main(){ 42 scanf("%d%d",&a,&b); 43 pre(); 44 printf("%d",calc(b)-calc(a-1)); 45 }