hdoj 2089 不要62 【数位dp】
2016-02-04 18:55
567 查看
不要62
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 29141 Accepted Submission(s): 10228
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
数位dp入门:
dp[i][0]: i位数中不含不吉利数字的个数。
dp[i][1]: i位数中不含不吉利数字 最高位是2的个数。
dp[i][2]: i位数中含不吉利数字的个数。
AC代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #include <map> #include <set> #include <vector> #include <string> #define INF 1000000 #define eps 1e-8 #define MAXN (200000+10) #define MAXM (100000+10) #define Ri(a) scanf("%d", &a) #define Rl(a) scanf("%lld", &a) #define Rf(a) scanf("%lf", &a) #define Rs(a) scanf("%s", a) #define Pi(a) printf("%d\n", (a)) #define Pf(a) printf("%.2lf\n", (a)) #define Pl(a) printf("%lld\n", (a)) #define Ps(a) printf("%s\n", (a)) #define W(a) while((a)--) #define CLR(a, b) memset(a, (b), sizeof(a)) #define MOD 1000000007 #define LL long long #define lson o<<1, l, mid #define rson o<<1|1, mid+1, r #define ll o<<1 #define rr o<<1|1 #define PI acos(-1.0) #pragma comment(linker, "/STACK:102400000,102400000") #define fi first #define se second using namespace std; typedef pair<int, int> pii; int dp[8][3]; void Init() { dp[0][0] = 1; for(int i = 1; i <= 6; i++) { dp[i][0] = dp[i-1][0] * 9 - dp[i-1][1]; dp[i][1] = dp[i-1][0]; dp[i][2] = dp[i-1][2] * 10 + dp[i-1][0] + dp[i-1][1]; } } int bit[8]; int Count(int n) { int len = 0; int ans = 0, total = n; while(n) { bit[++len] = n % 10; n /= 10; } bit[++len] = 0; bool flag = false; for(int i = len-1; i >= 1; i--) { ans += dp[i-1][2] * bit[i];//第i为填0 - bit[i]-1 if(flag) {ans += dp[i-1][0] * bit[i]; continue;}//高位已经不合法 if(bit[i] > 4) ans += dp[i-1][0];//该位可以填4 if(bit[i+1] == 6 && bit[i] > 2) ans += dp[i][1];//填62 if(bit[i] > 6) ans += dp[i-1][1];//填62 if(bit[i] == 4 || (bit[i+1] == 6 && bit[i] == 2)) flag = true;//高位不合法 } if(flag) ans++;//自己 return total - ans; } int main() { Init(); int n, m; while(scanf("%d%d", &n, &m), n||m){ Pi(Count(m) - Count(n-1)); } return 0; }
相关文章推荐
- 杭电5563
- 简单高精度算法
- Jquery自定义图片上传插件
- 数据类型的强制转换
- linux centos6.5 ftp网页vsftpd配置
- linux centos6.5 ftp网页vsftpd配置
- settimeofday(系统调用)
- Android adb基本命令-cd,ls,目录相关命令
- [LeetCode]152. Maximum Product Subarray
- Android adb基本命令-cd,ls,目录相关命令
- Android adb基本命令-cd,ls,目录相关命令
- 模板_KMP和AC自动机
- Android adb基本命令-cd,ls,目录相关命令
- LeetCode :Word Ladder II My Solution
- wordcount加强版和各种wordCount
- Codeforces Round #322 (Div. 2) D. Three Logos(暴力)
- 开启Hadoop2.6.0出现ssh无法解析主机名等错误提示的解决办法!
- 二进制 快速count 1
- 当技术遇到内容
- tcpdump