HDOJ 2089 不要62

超级简单的数位DP....

不要62

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 17584    Accepted Submission(s): 5800

Problem Description

杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。

杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。

不吉利的数字为所有含有4或62的号码。例如:

62315 73418 88914

都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。

你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。

Input

输入的都是整数对n、m(0<n≤m<1000000),如果遇到都是0的整数对,则输入结束。

Output

对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。

Sample Input

1 100
0 0

Sample Output

80

Author

qianneng

Source

迎接新学期——超级Easy版热身赛

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn=1000010;

int dp[8][3];
int bit[8];

int dfs(int pos,int s,int limit)
{
    if(pos==-1)
        return s==0||s==1;///目标状态

    if(!limit&&dp[pos][s]!=-1) return dp[pos][s];
    int end=limit?bit[pos]:9;
    int ans=0;

    for(int i=0;i<=end;i++)
    {
        int news=0;
        if(i==4) news=2;
        if(i==2&&s==1) news=2;
        if(i==6) news=1;
        if(s==2) news=2;

        ans+=dfs(pos-1,news,limit&&i==end);
    }

    if(!limit) dp[pos][s]=ans;
    return ans;
}

int solve(int x)
{
    int pos=0;
    while(x)
    {
        bit[pos++]=x%10;
        x/=10;
    }
    return dfs(pos-1,0,1);
}

int main()
{
    memset(dp,-1,sizeof(dp));
    int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
    if(n==0&&m==0) break;
    printf("%d\n",solve(m)-solve(n-1));
}
    return 0;
}

HDOJ 2089 不要62

时间: 2024-08-23 15:48:16

HDOJ 2089 不要62的相关文章

hdoj 2089 不要62 【打表】

题意:.. 水题 代码: #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int s[10]; int ans[1000005] = {0, 1}; int is(int n){ //n = 62; int pre = 0, cur = 0, i; while(n){ pre = cur; cur = n%10; n /= 10; if(cur == 4||

【HDOJ 2089】不要62

[HDOJ 2089]不要62 第一个数位dp的题 做的老困难了...不过好歹是做出来了 迈出了第一步.. 对大牛来说这种题都是小case 代码如下: #include <iostream> #include <cstdio> #include <cstring> using namespace std; int dp[8][3]; /* dp[i][0]无不吉利数字 dp[i][1]无不吉利数字且高位为2 dp[i][2]有不吉利数字 */ void Init() {

hdu 2089 不要62 (数位dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 思路:用变量记录吉利数,和最高位为2的吉利数还有不是吉利数的个数... code: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[10][3]; //dp[i][j] ,i表示位数,j表示状态<pre name="code"

[ACM] hdu 2089 不要62(数位Dp)

不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 19043    Accepted Submission(s): 6442 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就

HDU 2089 不要62(数位DP,三种姿势)

HDU 2089 不要62(数位DP,三种姿势) ACM 题目地址:HDU 2089 题意: 中文题意,不解释. 分析: 100w的数据,暴力打表能过 先初始化dp数组,表示前i位的三种情况,再进行推算 直接dfs,一遍搜一变记录,可能有不饥渴的全部算和饥渴的部分算情况,记录只能记录全部算(推荐看∑大的详细题解Orz) 代码: 1. 暴力 (以前写的) /* * Author: illuz <iilluzen[at]gmail.com> * File: 2089_bf.cpp * Create

hud 2089 不要62 (数位dp)

#include<stdio.h> #include<string.h> #include<math.h> #define max 10 int dp[max][3]; int number[max]; //dp[i][0] 前i位数中不符合要求的总个数 //dp[i][1] 前i位数中最高位是2的个数 //dp[i][2] 前i位数中存在含4和有连续62的个数 void init() { memset(dp,0,sizeof(dp)); dp[0][0]=1; for

HDU - 2089 不要62 (暴力或数位DP)

Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众. 不吉利的数字为所有含有4或62的号码.例如: 62315 73418 88914 都属于不吉利号码.但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列. 你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新

HDOJ 题目2089 不要62(数位DP,重刷)

不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 25399    Accepted Submission(s): 8793 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就

HDOJ题目2089 不要62(数位DP)

不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 25391    Accepted Submission(s): 8788 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就