不要62
学习于数位dp总结 之 从入门到模板
里面的介绍中dfs函数有一个pre参数,可以省略。
题目的要求就是一个范围内的数不含4和62的数的个数,两道基础题。
#include<stdio.h>
#include<string.h>
int a[20],dp[20][2];
int dfs(int pos,int sta,int flag){//分别存的第几位,上一位是否是6,是否达到上界
if(pos==-1) return 1;
if(!flag&&dp[pos][sta]!=-1) return dp[pos][sta];
int up=flag?a[pos]:9;//没达到上界就可以从0到9,达到上界他就是不完整的
int i,sum=0;
for(i=0;i<=up;i++){
if(i!=4&&!(sta&&i==2))
sum+=dfs(pos-1,i==6,flag&&i==a[pos]);
}
if(!flag) dp[pos][sta]=sum;//没达到上界才可记录
return sum;
}
int solve(int n){
int c=0;
while(n){
a[c++]=n%10;
n/=10;
}
return dfs(c-1,0,1);
}
int main()
{
int n,m;
while(~scanf("%d %d",&m,&n)&&(m&&n)){
memset(dp,-1,sizeof(dp));
printf("%d\n",solve(n)-solve(m-1));
}
return 0;
}
#include<stdio.h>
#include<string.h>
typedef long long ll;
ll a[25],dp[25][2];
ll dfs(int pos,int sta,int flag){
if(pos==-1) return 1;
if(!flag&&dp[pos][sta]!=-1) return dp[pos][sta];
int up=flag?a[pos]:9;
int i;
ll sum=0;
for(i=0;i<=up;i++){
if(!(sta&&i==9))
sum+=dfs(pos-1,i==4,flag&&i==a[pos]);
}
if(!flag) dp[pos][sta]=sum;
return sum;
}
ll solve(ll x){
int c=0;
while(x){
a[c++]=x%10;
x/=10;
}
return dfs(c-1,0,1);
}
int main()
{
int n;
ll x;
scanf("%d",&n);
while(n--){
scanf("%lld",&x);
memset(dp,-1,sizeof(dp));
printf("%lld\n",x+1-solve(x));
}
return 0;
}
来源:CSDN
作者:海马有力量
链接:https://blog.csdn.net/qq_20087731/article/details/103742893