HDU2089 不要62 数位dp

网址:https://vjudge.net/problem/HDU-2089

题意:

从给定的范围中求出有几个数的序列中不包括$‘4’$和$‘62’$。

题解:

数位dp板子题,看注释。

AC代码:

#include <bits/stdc++.h>
using namespace std;
int dp[20][2];//第i是j的情况
int a[20];
int dfs(int pos,int pre,bool lim,bool tag)//这一位的数字,上一位数字,上限,6的标记
{
    if(pos==-1)//已经到尽头了
        return 1;
    if(!lim&&dp[pos][tag]!=-1)//记忆化搜索,一定要判断是否有边界,有边界时计算不存在情况。
        return dp[pos][tag];
    int res=lim?a[pos]:9;//设置边界
    int ans=0;
    for(int i=0;i<=res;++i)
    {
        if(i==4||(i==2&&pre==6))
            continue;
        ans+=dfs(pos-1,i,lim&&i==a[pos],i==6);//有边界且i到达了边界,下一位也才有边界
    }
    if(!lim)
        dp[pos][tag]=ans;//记录
    return ans;
}
int solve(int num)
{
    memset(a,0,sizeof(a));          
    int pos=0;
    while(num)
    {
        a[pos++]=num%10;
        num/=10;
    }
    return dfs(pos-1,0,true,0);//刚开始的时候一定有边界
}
int main()
{
    int n,m;
    while(cin>>n>>m&&n+m)
    {
        memset(dp,-1,sizeof(dp));
        cout<<solve(m)-solve(n-1)<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Aya-Uchida/p/11219802.html