参考了题解,理解仍然还不够透彻
#include<bits/stdc++.h> using namespace std; const int N=550; const int maxn=1e6+7; int num[maxn]; int dp[N][N]; int a,b; int dfs(int len,int pre,bool flag,bool zero) { if(len==0) { return 1; } if(!zero&&!flag&&dp[len][pre]!=-1) { return dp[len][pre]; } int p,cnt=0,maxx=(flag?num[len]:9); for(int i=0;i<=maxx;i++) { if(abs(i-pre)<2) { continue; } p=i; if(zero&&i==0) { p=-233; } cnt+=dfs(len-1,p,(flag)&&(i==maxx),(p==-233)); } if(!flag&&!zero) { dp[len][pre]=cnt; } return cnt; } int solve(int x) { int k=0; while(x) { num[++k]=x%10; x/=10; } memset(dp,-1,sizeof(dp)); return dfs(k,-233,true,true); } int main() { scanf("%d%d",&a,&b); printf("%d",solve(b)-solve(a-1)); return 0; }