您的位置:首页 > 编程语言

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程