题目链接
题意:询问一个区间[L,R]里面,数字含有4或者62的
分析:数位dp的入门题目,一个不错的学习资源
还有一个详细解说
基本上就是这样了,上面对dfs的参数及每一句话分析的很清楚了。基本上定义好状态就可以了。
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define cl(a,b) memset(a,b,sizeof(a))
const int maxn=205;
const int inf=1<<28;
double pi=acos(-1.0);
#define gcd __gcd
int bit[20];//分解数的每一位
int dp[20][2];//dp:用于记录dfs参数的状态
int dfs(int len,bool is6,bool isMax){
if(len==-1)return 1;
/*isMax必须是false,才可以返回,这是因为,我们的dp记录的是
完整的数量,当isMax到达最大的时候,记录是不全的,所以dfs最后返回的时候也是要判断的
*/
if(!isMax&&~dp[len][is6])return dp[len][is6];
int res=0;
int u=isMax?bit[len]:9;
for(int i=0;i<=u;i++){
if(i==4||is6&&i==2)continue;
res+=dfs(len-1,i==6,isMax&&i==u);
}
/*dp[len][is6]:记录是一个完整的区间,当isMax有可能不是完整的,所以不记录*/
return isMax?res:dp[len][is6]=res;
}
int f(int x){
int len=0;
while(x){
bit[len++]=x%10;
x/=10;
}
len--;
return dfs(len,false,true);
}
int main(){
int L,R;
while(~scanf("%d%d",&L,&R)&&(L+R)){
cl(dp,-1);
printf("%d\n",f(R)-f(L-1));
}
return 0;
}