题意:
给两个数A,B。你需要找出有多少个x满足下面的两个条件
- A<=x<=B;
- x的每一位与相邻位的差值大于等于2
题解:
开始看出了小于等于2.。。。然后还一本正经的写对了,,其实这类数位dp的题还是很简单的。首先从高位枚举到低位,记住是否卡住了上界,或者之前的数一直是0,再者,记住上一次枚举的数字,后面的就是dfs记忆化存储一下
code:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int xbit[31],tot=0;
int dp[30][10][2][2];
int dfs(int dep,int cur,bool limt,bool zero){//limit上一次是否到达上界,now已存值,dep目前深度
if(dep==-1)return 1;
if(dp[dep][cur][limt][zero]!=-1)return dp[dep][cur][limt][zero];
int up=limt?xbit[dep]:9,down=0,ans=0;
for(int i=down;i<=up;i++){
if(zero)ans+=dfs(dep-1,i,limt&&i==xbit[dep],zero&&i==0);
else if(abs(i-cur)>=2)ans+=dfs(dep-1,i,limt&&i==xbit[dep],zero&&i==0);
}
return dp[dep][cur][limt][zero]=ans;
}
int solve(int x){
if(x<10)return x+1;
memset(dp,-1,sizeof dp);
memset(xbit,0,sizeof xbit);
tot=0;
int ans=0;
while(x){
xbit[tot++]=x%10;
x/=10;
}
for(int i=0;i<=xbit[tot-1];i++)
ans+=dfs(tot-2,i,i==xbit[tot-1],i==0);
return ans;
}
int main(){
int a,b;
cin>>a>>b;
cout<<solve(b)-solve(a-1)<<endl;
return 0;
}