您的位置:首页 > 其它

hdu 2089 不要62 --- 数位dp

2014-02-09 17:33 405 查看
简单题

bool six保存上一位是不是6

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define inf 0x3f3f3f3f
#define ll __int64
using namespace std;

int dp[15][2],num[15],n,m;

int dfs(int len,bool six,bool flag)
{
    if(len<0) return 1;
    if(!flag&&dp[len][six]!=-1) return dp[len][six];

    int p=flag?num[len]:9;
    int ans=0,i;
    for(i=0;i<=p;i++)
    {
        if(i==4||(i==2&&six))
            continue;
        ans+=dfs(len-1,i==6,flag&&i==p);
    }
    if(!flag) dp[len][six]=ans;
    return ans;
}

int cal(int x)
{
    int l=0;
    while(x)
    {
        num[l++]=x%10;
        x/=10;
    }
    return dfs(l-1,0,1);
}

int main()
{
    memset(dp,-1,sizeof dp);
    while(scanf("%d%d",&n,&m)&&(n||m))
    {
        printf("%d\n",cal(m)-cal(n-1));
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: