题目大意
w
i
n
d
y
windy
windy定义了一种
w
i
n
d
y
windy
windy数。
不含前导零且相邻两个数字之差至少为
2
2
2的正整数被称为
w
i
n
d
y
windy
windy数。
w
i
n
d
y
windy
windy想知道,在
A
A
A和
B
B
B之间,包括
A
A
A和
B
B
B,总共有多少个
w
i
n
d
y
windy
windy数?
题目解析
设 a n s [ n ] ans[n] ans[n]为 0 0 0- n n n 中 w i n d y windy windy 数的个数,求 A A A- B B B 以内的 w i n d y windy windy 数个数,也就是求 a n s [ B ] − a n s [ A − 1 ] ans[B]-ans[A-1] ans[B]−ans[A−1]
很明显是数位 D P DP DP,很经典的题。
代码
#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);
}