http://www.lydsy.com/JudgeOnline/problem.php?id=1026
数位DP
如果前一位填的是0,
0是前导0,下一位可以随便填
0不是前导0,下一位不能填1
为避免这种情况
枚举位数,强制不出现前导0
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[12][12]; int a[11]; int LEN; int dfs(int dep,int num,bool lim) { if(!lim && dp[dep][num]!=-1) return dp[dep][num]; if(!dep) return 1; int up= lim ? a[dep] : 9,tmp=0; for(int i=0;i<=up;++i) { if(dep==LEN && !i) continue; if(abs(i-num)<2) continue; tmp+=dfs(dep-1,i,lim && i==up); } if(!lim) dp[dep][num]=tmp; return tmp; } int solve(int n) { if(!n) return 0; int len=0; while(n) { a[++len]=n%10; n/=10; } int sum=0; for(int i=1;i<len;++i) { LEN=i; sum+=dfs(i,11,0); } LEN=len; sum+=dfs(len,11,1); return sum; } int main() { int a,b; scanf("%d%d",&a,&b); memset(dp,-1,sizeof(dp)); printf("%d\n",solve(b)-solve(a-1)); }