题解:
非常明显的数位
dp
d
p
。
我们发现非回文数只要两个相同的数字不相邻或只隔一个数字即可。
按照这一性质进行
dp
d
p
。
Code:
C
o
d
e
:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll l,r,dp[100][10][10][2][2];int cnt,a[100];;
ll dfs(int k,int pre,int pre1,int sta,int pz,int pz1)
{
if(k==1)return 1;
if(!sta&&dp[k][pre][pre1][pz][pz1]!=-1)return dp[k][pre][pre1][pz][pz1];
ll ans=0;
int all=(sta)?(a[k-1]):(9);
for(int i=0;i<=all;i++)
if((!pz&&pre==i)||(!pz1&&i==pre1))continue;else
ans+=dfs(k-1,i,pre,(sta&&i==all),(pz&&i==0),pz);
if(!sta)dp[k][pre][pre1][pz][pz1]=ans;
return ans;
}
ll find(ll n)
{
memset(dp,-1,sizeof(dp));
if(!n)return 1;
cnt=0;
while(n)
{
a[++cnt]=n%10;
n/=10;
}
return dfs(cnt+1,0,0,1,1,1);
}
int main()
{
scanf("%lld%lld",&l,&r);
printf("%lld\n",find(r)-find(l-1));
}