zoukankan      html  css  js  c++  java
  • HDOJ2089. 不要62(数位DP)

    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版热身赛

    数位dp水题,详情看注释。

    #include <bits/stdc++.h>
    using namespace std;
    int n, m, num[32], dp[32][32][2][2], len = 0;//参数为从高到低当前处理到第几位 范围是1到len last是上一位的数 flag表示之前的部分是否紧贴边界 zero表示是否有前导0
    int dfs(int len, int last, int flag, int zero) {
    	if(len == 0) return 1;
    	if(dp[len][last][flag][zero] != -1) return dp[len][last][flag][zero];//之前被搜过直接返回
    	int ans = 0;
    	for(int i = 0; i <= 9; i++) {
    		if(!(last == 6 && i == 2) && i != 4 && (flag && i <= num[len] || !flag))//flag && i <= num[len] || !flag表示当前可以取到的范围的判定
    			ans += dfs(len - 1, i, flag && (i == num[len]), zero && (i == 0));
    	}
    	return (dp[len][last][flag][zero] = ans);//记忆化
    }
    int solve(int x) {//计算1到x里面有多少个符合条件的数
    	int xx = x;
    	len = 0;
    	memset(num, 0, sizeof(num));
    	while(xx) {//获得上界的每一位
    		int now = xx % 10;
    		xx /= 10;
    		len++;
    		num[len] = now;
    	}
    	memset(dp, -1, sizeof(dp));
    	return dfs(len, 11, 1, 1);
    }
    int main() {
    	while(cin >> n >> m && n && m) {
    		cout << solve(m) - solve(n - 1) << endl;//类似前缀和思想
    	}
    	return 0;
    }
    
  • 相关阅读:
    iOS ARC编译器规则和内存管理规则
    Servlet与JSP的关系
    传统javabean与spring中的bean的区别
    servlet学习笔记
    JAVA里面"=="和euqals的区别
    java垃圾回收
    java中初始化块、静态初始化块和构造方法
    抽象类与接口的区别
    Servlet 与 CGI 的比较
    spring的事务传播特性
  • 原文地址:https://www.cnblogs.com/lipoicyclic/p/14715023.html
Copyright © 2011-2022 走看看