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 }