不要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;
}