江泽OJ好,远离bzoj保平安。
仍然沿用之前的记忆化搜索的办法即可。
#include<bits/stdc++.h> #define N 10010 using namespace std; int a[20],dp[20][20]; int dfs(int x,int pre,int lim){ if(x==-1)return 1; if(!lim&&~dp[x][pre]&&pre>=0)return dp[x][pre]; int maxv=lim?a[x]:9,ret=0;int st=0; for(int i=0;i<=maxv;i++){ if(abs(i-pre)<2)continue; st=i;if(i==0&&pre==-10)st=pre; ret+=dfs(x-1,st,lim&&(i==maxv)); } if(pre>=0&&!lim)dp[x][pre]=ret; return ret; } inline int work(int x){ int len=0; while(x){a[len++]=x%10;x/=10;} memset(dp,255,sizeof(dp)); return dfs(len-1,-10,1); } inline int read(){ int f=1,x=0;char ch; do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9'); do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9'); return f*x; } int main(){ int l=read(),r=read(); printf("%d ",work(r)-work(l-1)); }