【数位DP】 HDU 2089

来源:互联网 发布:python系统变量 name 编辑:程序博客网 时间:2024/04/19 01:02

点击打开链接

区间内不出现4 或者62 的个数


#include <cstdio>#include <cstring>#include <cstdlib>#include <string>#include <iostream>#include <algorithm>#include <sstream>#include <cmath>using namespace std;#include <queue>#include <stack>#include <vector>#include <deque>#include <set>#include <map>#define cler(arr, val)    memset(arr, val, sizeof(arr))#define FOR(i,a,b)  for(int i=a;i<=b;i++)#define IN   freopen ("in.txt" , "r" , stdin);#define OUT  freopen ("out.txt" , "w" , stdout);typedef long long  LL;const int MAXN = 1011;const int MAXM = 610;const int INF = 0x3f3f3f3f;const LL mod = 2147483647;const double eps= 1e-8;const double pi=acos(-1.0);#define lson l,m, rt<<1#define rson m+1,r,rt<<1|1int len,dig[10];int f[10][10][5];int dfs(int pos,int pre,int fg,int limit)//pre上一位的值,fg == 1满足条件,limit ==1 到达临界{    if (pos<0)        return fg==0;    if (!limit&&f[pos][pre][fg]!=-1)        return f[pos][pre][fg];    int res=0;    int last=limit?dig[pos]:9;    for (int i=0;i<=last;i++)    {        res+=dfs(pos-1,i,fg||((pre==6)&&(i==2))||(i==4),limit&&(i==last));    }    if (!limit) f[pos][pre][fg]=res;    return res;}int solve(int n){    len=0;    cler(f,-1);    while(n)    {        dig[len++]=n%10;        n/=10;    }    return dfs(len-1,0,0,1);}int main(){    int x,y;    while(scanf("%d%d",&x,&y),x||y)    {        printf("%d\n",solve(y)-solve(x-1));    }    return 0;}


0 0
原创粉丝点击