[swustoj 1097] 2014

2014(1097)

问题描述

今年是2014年,所以小明喜欢2014的每一位数字(即:2,0,1,4),小明想知道在区间[l,r](包括l和r)中有多少个数中含有这4个数字(数字无前缀零)。

输入

多组数据。

每组数据输入2个数l,r(0<l<r<=10^9)

输出

输出占一行,即区间[l,r](包括l和r)中包含的满足条件的数的个数

样例输入

1 10
100 1024

样例输出

0

1

简单数位DP

#include <iostream>

#include <cstdio>

#include <cstring>

#include <cmath>

using namespace std;



int bit[20];

int dp[20][2][2][2][2];



int dfs(int pos,int n2,int n0,int n1,int n4,bool limit,bool fzero)

{

    if(pos==-1)

    {

        return n2&n0&n1&n4;

    }

    if(!limit && !fzero && dp[pos][n2][n0][n1][n4]!=-1) return dp[pos][n2][n0][n1][n4];

    int end=limit?bit[pos]:9;

    int ans=0;

    for(int i=0;i<=end;i++)

    {

        int nn2=i==2?1:0;

        int nn0=i==0?1:0;

        int nn1=i==1?1:0;

        int nn4=i==4?1:0;

        if(fzero) nn0=0;

        ans+=dfs(pos-1,n2|nn2,n0|nn0,n1|nn1,n4|nn4,limit && i==end,fzero && !i);

    }

    if(!limit && !fzero) dp[pos][n2][n0][n1][n4]=ans;

    return ans;

}

int cal(int n)

{

    int len=0;

    while(n)

    {

        bit[len++]=n%10;

        n/=10;

    }

    return dfs(len-1,0,0,0,0,1,1);

}

int main()

{

    int l,r;

    memset(dp,-1,sizeof(dp));

    while(cin>>l>>r)

    {

        cout<<cal(r)-cal(l-1)<<"\n";

    }

    return 0;

}

 

你可能感兴趣的:(OJ)