[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;
}

 

posted @ 2015-05-07 22:45  哈特13  阅读(669)  评论(0编辑  收藏  举报