题意:不含前导零且相邻两个数字之差至少为2的正整数被称为windy数
求[a,b]内的windy数? a,b<=2e9.
求[a,b]内的windy数? a,b<=2e9.
记录位数和前面一个数字.数位dp存当前状态出发时能获得的方法数.暴力记忆化即可.
注意:返回dp[pos][sta]时:当sta为0 要判断当前状态是否为前导0状态.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> ii;
const int N=240;
ll dp[N][N],l,r,a[N];
ll dfs(int pos,int sta,bool flag,bool limit)//limitµ±Ç°Î»ÊÇ·ñÓÐÏÞÖÆ.
{
if(pos==-1)
return 1;
if(!limit&&(!flag)&&dp[pos][sta]!=-1)
return dp[pos][sta];
int up=limit?a[pos]:9;
ll sum=0;
for(int i=0;i<=up;i++)
{
if(flag==false&&abs(sta-i)<2) continue;
sum+=dfs(pos-1,i,flag&&i==0,limit&&i==a[pos]);
}
if(!limit&&!flag)
dp[pos][sta]=sum;
return sum;
}
ll solve(ll x)
{
int pos=0;
while(x)
{
a[pos++]=x%10;
x/=10;
}
return dfs(pos-1,0,true,true);
}
int main()
{
memset(dp,-1,sizeof(dp));
while(cin>>l>>r)
printf("%lld\n",solve(r)-solve(l-1));
return 0;
}