hdu 2089 不要62

来源:互联网 发布:淘宝天猫2015年销售额 编辑:程序博客网 时间:2024/06/07 05:02
杭州人称那些傻乎乎粘嗒嗒的人为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

import java.util.Arrays;import java.util.Scanner;/** * 数位DP:不要62 */public class Hdu_2089 {    public static int[] digit;    public static int len;    public static int[][] dp;    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        while (true) {            int n = scanner.nextInt();            int m = scanner.nextInt();            dp = new int[25][15];            digit = new int[30];            init(dp);            if (n == 0 && m == 0)                return ;            System.out.println(solve(m) - solve(n - 1));        }    }    public static int solve(int n) {        len = 0;        while (n > 0) {            digit[++len] = n % 10;            n /= 10;        }        return dfs(len, 0, true);    }    /**     * 从高位到低位递归     * @param pos     * @param j 表示上一个数子是否为6     * @param limit 表示该位置是否有限制     * @return     */    public static int dfs(int pos, int j, boolean limit) {        //到该位置表明找到一个解        if (pos == 0)            return 1;        int res = 0;        //如果不是limit位置,表示结果是通用的,而之前又算过的话,就可以直接调用这个结果        if (!limit && dp[pos][j] != -1)            return dp[pos][j];        int mx = limit ? digit[pos] : 9;        for (int i = 0; i <= mx; i++) {            if (i == 4 || (i == 2 && j == 1))                continue;            int tmp = (i == 6) ? 1 : 0;            //(limit && i == mx)中limit表示:如果前一位不是limit位,那么之后的位也一定不是limit位置            //i== mx表示:在当前位置的数字小于当前位置最大值,后面位的数字随便取,也不会超过上界            res += dfs(pos - 1, tmp, limit && i == mx);        }        if (!limit)            dp[pos][j] = res;        return res;    }    public static void init(int[][] dp) {        int n = dp.length;        int m = dp[0].length;        for (int i = 0; i < n; i++) {            for (int j = 0; j < m; j++) {                dp[i][j] = -1;            }        }    }}


原创粉丝点击