题目大意
windywindywindy定义了一种windywindywindy数。
不含前导零且相邻两个数字之差至少为222的正整数被称为windywindywindy数。
windywindywindy想知道,在AAA和BBB之间,包括AAA和BBB,总共有多少个windywindywindy数?
题目解析
设 ans[n]ans[n]ans[n]为 000-nnn 中windywindywindy 数的个数,求 AAA-BBB 以内的 windywindywindy 数个数,也就是求ans[B]−ans[A−1]ans[B]-ans[A-1]ans[B]−ans[A−1]
很明显是数位DPDPDP,很经典的题。
代码
#include<bits/stdc++.h>
using namespace std;
int f[15][15][2][2],a[15];
int dp(int pos,int pre,bool zero,bool lim)
{
if(pos<1) return 1;
if(f[pos][pre][zero][lim]>=0) return f[pos][pre][zero][lim];
int end=lim?a[pos]:9,ans=0;
for(int i=0;i<=end;i++)
if(abs(i-pre)>=2||zero)
ans+=dp(pos-1,i,zero&&(i==0),lim&&(i==end));
f[pos][pre][zero][lim]=ans;
return ans;
}
int calc(int x)
{
int cnt=0;
memset(f,-1,sizeof(f));
memset(a,0,sizeof(a));
while(x) a[++cnt]=x%10,x/=10;
dp(cnt,0,1,1);
}
int main()
{
int a,b;
cin>>a>>b;
cout<<calc(b)-calc(a-1);
}