http://acm.uestc.edu.cn/problem.php?pid=1307

中文题不解释。。。

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 int dp[15][10];
 7 void init()
 8 {
 9     memset(dp,0,sizeof(dp));
10     for(int i=0;i<10;i++)
11     dp[1][i]=1;
12     for(int i=2;i<12;i++)
13     for(int j=0;j<10;j++)
14     for(int k=0;k<10;k++){
15         if(abs(j-k)>=2)
16             dp[i][j]+=dp[i-1][k];
17     }
18     
19 }
20 int solve(int x)
21 {
22     int dig[20],ans=0,cnt=0,flag=1,tmp=x;
23     while(x){
24         dig[++cnt]=x%10;
25         x/=10;
26     }
27     if(cnt==1)
28     return tmp-1;
29     dig[cnt+1]=-1;
30     ans+=9;
31     for(int i=cnt-1;i>1;i--)
32         for(int j=1;j<10;j++)
33             for(int k=0;k<10;k++)
34                 if(abs(j-k)>=2)
35                     ans+=dp[i-1][k];
36     for(int i=cnt;i>0&&flag;i--){
37         for(int j=0;j<dig[i];j++)
38             if(abs(j-dig[i+1])>=2){
39                 if(i==1){
40                     ans++;
41                     continue;
42                 }
43                 
44                 for(int k=0;k<10;k++)
45                     if(abs(j-k)>=2)
46                         ans+=dp[i-1][k];
47             }
48         
49         if(abs(dig[i]-dig[i+1])<2)
50             flag=0;
51     }
52     return ans;
53 }
54 int main()
55 {
56     init();
57     int a,b;
58     while(~scanf("%d%d",&a,&b))
59         printf("%d\n",solve(b+1)-solve(a));
60     return 0;
61 }
AC Code