SDUT 3904 C~K的幸运数字(数位DP)
2017-05-21 10:30
363 查看
Problem Description
据说,QAQ 的幸运数字是含有 "47" (4 和 7 相邻)的数,例如 47, 147, 247, 470, 471, 2047 是他的幸运数字,而 74, 1234, 407 就不是他的幸运数字。而对 C~K 来说,只要不是 QAQ 的幸运数字的数都是他的幸运数字。那么他想问你,在闭区间 [l, r] 中,有多少个自己的幸运数字?
Input
输入数据有多组。第 1 行输入 1 个整数 T (1 <= T <= 10000) 表示数据组数。对于每组数据,输入 1 行,包含 2 个整数 l, r (1 <= l <= r < 10^9),表示 C~K 要询问的区间。
Output
对于每组数据,在 1 行中输出 1 个整数,表示区间内 C~K 的幸运数字的个数。
Example Input
3 1 1 10 50 1 500
Example Output
1 40 485
// 裸数位dp的一道题, 感觉数位dp不是我等小辈所能讲的懂的, 不如直接奉上代码
#include <cstdio> #include <cstring> #include <algorithm> #include <istream> using namespace std; #define N 20 int bit[20]; int dp[20][2]; int dfs(int pos, bool is4, bool islimited) { if(pos == -1) return 1; if(!islimited && dp[pos][is4]) return dp[pos][is4]; int end = islimited ? bit[pos] : 9; int ans = 0; for(int i = 0; i <= end; i++) { if(is4 && i == 7) continue; ans += dfs(pos- 1, i == 4, islimited && i == end); } if(!islimited) { dp[pos][is4] = ans; } return ans; } int solve(int n) { int l = 0; while(n) { bit[l++] = n % 10; n /= 10; } return dfs(l - 1, false, true); } int main() { int left; int right; int t; scanf("%d", &t); while(t--) { scanf("%d %d", &left, &right); printf("%d\n", solve(right) - solve(left - 1)); } return 0; }
相关文章推荐
- 幸运数字 (数位DP)
- 51nod 1043 幸运数字(数位dp)
- [省选] [数位DP] [HLOI2016] 幸运数字
- sdut 3904 数位dp(题目数据范围是错的)
- 【数位DP】C~K的幸运数字
- 1833: [ZJOI2010]count 数字计数——数位dp
- sdut1730 数字三角形问题(dp入门题)
- 51nod:数字1的数量(线性dp or 数位dp)
- 【bzoj3679】 数字之积 数位dp
- zznu 1255 数字统计(数位DP, 数学方法)
- 51nod1230 幸运数 (数位dp)
- bzoj1833: [ZJOI2010]count 数字计数(数位dp)
- 【codevs1359】【BZOJ1833】数字计数,进击的学弟与数位DP
- SSL2792 2017年10月25日提高组T2 数字问题(数位dp)
- 1042 数字0-9的数量(数位DP)
- 数位DP - 数字1的数量
- 51nod 1043 幸运号码 数位dp
- [BZOJ 1833][ZJOI 2010]count数字计数(数位DP)
- gdut Problem G: 等凹数字 (数位dp)
- 数位dp 等凹数字 (未完成)