HDU 3555 Bomb

Problem Description

The counter-terrorists found a time bomb in the dust. But this time the terrorists improve on the time bomb. The number sequence of the time bomb counts from 1 to N. If the current number sequence includes the sub-sequence "49", the power of the blast would add one point.
Now the counter-terrorist knows the number N. They want to know the final points of the power. Can you help them?

Input

The first line of input consists of an integer T (1 <= T <= 10000), indicating the number of test cases. For each test case, there will be an integer N (1 <= N <= 2^63-1) as the description.

The input terminates by end of file marker.

Output

For each test case, output an integer indicating the final points of the power.

Sample Input

3
1
50
500

Sample Output

0
1
15

Hint

From 1 to 500, the numbers that include the sub-sequence "49" are "49","149","249","349","449","490","491","492","493","494","495","496","497","498","499",

so the answer is 15.


简单数位dp

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
const int maxn = 20;
long long f[maxn][10], n;
int T;

void get()
{
	memset(f, 0, sizeof(f));
	for (int i = 0; i < 10; i++) f[1][i] = 1;
	for (int i = 2; i <= 20; i++)
		for (int j = 0; j < 10; j++)
			for (int k = 0; k < 10; k++)
				if (j != 4 || k != 9) f[i][j] += f[i - 1][k];
}

long long work()
{
	long long sum = 0, x = max(n, n + 1);
	int digit[maxn] = {0}, tot = 0;
	while (x)
	{
		digit[++tot] = x % 10;
		x /= 10;
	}
	for (int i = tot; i >= 1; i--)
	{
		for (int j = digit[i] - 1; j >= 0; j--)
			sum += f[i][j];
		if (digit[i] == 9 && digit[i + 1] == 4) break;
	}
	return n - sum + 1;
}

int main()
{
	get();
	scanf("%d", &T);
	while (T--)
	{
		scanf("%lld", &n);
		printf("%lld\n", work());
	}
	return 0;
}


你可能感兴趣的:(HDU,数位dp)