bzoj1026数位dp
基础的数位dp
但是ce了一发,(abs难道不是cmath里的吗?改成bits/stdc++.h就过了)
1 #include <bits/stdc++.h> 2 using namespace std; 3 int a,b,len; 4 int dp[100][100],dight[12]; 5 int solve(int x) 6 { 7 if (x==0) return 0; 8 int ans=0; 9 for(len=0;x>0;x/=10) 10 dight[++len]=x%10; 11 for(int i=1;i<=dight[len]-1;i++) 12 ans+=dp[len][i]; 13 for(int i=len-1;i>0;i--) 14 for(int j=1;j<=9;j++) 15 ans+=dp[i][j]; 16 for(int i=len-1;i>0;i--) 17 { 18 for(int j=0;j<=dight[i]-1;j++) 19 if (abs(dight[i+1]-j)>=2) ans+=dp[i][j]; 20 if(abs(dight[i+1]-dight[i])<2) break; 21 } 22 return ans; 23 } 24 int main() 25 { 26 scanf("%d%d",&a,&b); 27 for(int i=0;i<=9;i++) 28 dp[1][i]=1; 29 for(int i=2;i<=10;i++) 30 for(int j=0;j<=9;j++) 31 for(int k=0;k<=9;k++) 32 if(abs(j-k)>=2) 33 dp[i][j]+=dp[i-1][k]; 34 printf("%d\n", solve(b+1)-solve(a)); 35 }