90分:
#include<bits/stdc++.h>
#define ll register int
#define R register
#define mod 20070707
#define maxs 20070707
using namespace std;
int n,m;
int dp[15][15]={0};
int num[15]={0};
inline int work(ll x){
ll ans=0;
ll len=0,box=x;
memset(num,0,sizeof num);
while(box)num[++len]=box%10,box/=10;
for(ll i=1;i<=len-1;i++)for(ll j=1;j<=9;j++)ans+=dp[i][j];
for(ll j=1;j<=num[len]-1;j++)ans+=dp[len][j];
for(ll i=len-1;i>=1;i--){
for(ll j=0;j<=num[i]-1;j++){
if(abs(num[i+1]-j)>=2)ans+=dp[i][j];
}
if(abs(num[i+1]-num[i])<2)break;
}
return ans;
}
int main(){//freopen(".in","r",stdin);freopen(".out","w",stdout);
for(ll i=0;i<=9;i++)dp[1][i]=1;
for(ll i=2;i<=10;i++)for(ll j=0;j<=9;j++)
for(ll k=0;k<=9;k++)if(abs(j-k)>=2)dp[i][j]+=dp[i-1][k];
scanf("%d%d",&n,&m);
printf("%d",work(m)-work(n-1));//就是这里
return 0;
}
按照模板写的,后来看了大佬的题解,发现只要把第三十一行的:
f(m)-f(n-1)改成f(m+1)-f(n)
就AC了。疑惑ing……