不要62 ---数位DP

题意:求m到n中不含62和4的数的个数。

题目链接

思路:数位dp模板求满足的数字或不满足的数字,刚学,就求不满足的数。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
#define inff 0x3f3f3f3f
int dp[25][4];//位数,状态  0啥都不是,1第一位为6,2含有62,3含有4
int a[10];
int get(int str,int i)
{
    if(str==2)return 2;
    else if(str==3)return 3;
    else
    {
        if(i==4)
            return 3;
        if(str==1)
        {
            if(i==2)return 2;
        }
        if(i==6)return 1;
        return 0;
    }
}
int dfs(int pos,int str,int lim)
{
    if(pos==-1)
        return str==2||str==3;
    if(!lim&&dp[pos][str]!=-1)
        return dp[pos][str];
    int up=lim?a[pos]:9,ans=0;
    for(int i=0;i<=up;i++)
        ans+=dfs(pos-1,get(str,i),lim&&up==i);
    return lim?ans:dp[pos][str]=ans;
}
int solve(ll n)
{
    memset(dp,-1,sizeof(dp));
    memset(a,0,sizeof(a));
    int len=0;
    while(n)
    {
        a[len++]=n%10;
        n/=10;
    }
    return dfs(len-1,0,1);
}
int main()
{
    ll m,mm,n=1000000;
    while(cin>>m>>mm,m+mm)
       // cout<<solve(m)<<" "<<solve(mm)<<endl;
    cout<<mm-m+1-solve(mm)+solve(m-1)<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/swust5120171204/article/details/86023379
今日推荐