​不要62​

参考:

​ HDU2089 不要62 标准数位DP ​

从最高位开始递归,如果有4或者62则不往下走。

​dp[i][j]​​​表示的是有​​i​​​位数字,且第​​i​​​位数字为​​j​​并满足题给条件的数字的个数

其实也就是记忆化搜索的感觉,保留搜过的状态,以避免重复运算。

代码:

// Created by CAD on 2019/11/9.
#include <bits/stdc++.h>

#define mst(name, value) memset(name,value,sizeof(name))
using namespace std;

int dp[10][10];
int dig[10];
int dfs(int op,int last,bool flag)
{
if(op==0) return 1;
if(!flag&&~dp[op+1][last]) return dp[op+1][last];
int ans=0;
int up=flag?dig[op]:9;
for(int i=0;i<=up;++i)
if(i==4||(last==6&&i==2)) continue;
else ans+=dfs(op-1,i,flag&&(i==up));
if(!flag) dp[op+1][last]=ans;
return ans;
}
int solve(int x)
{
int cnt=0;
mst(dig,0);
while(x)
dig[++cnt]=x%10,x/=10;
return dfs(cnt,0,1);
}

int main()
{
ios::sync_with_stdio(false);
// cin.tie(0);
int n,m;
while(cin>>n>>m,n|m)
{
mst(dp,-1);
cout<<solve(m)-solve(n-1)<<"\n";
}
return 0;
}