现在的位置: 首页 > 综合 > 正文

HDU 3555 Bomb(数位DP)

2018年10月13日 ⁄ 综合 ⁄ 共 644字 ⁄ 字号 评论关闭

找出1 - N中所有包含49字串的数字个数

思路:普通的数位DP,先找出布包含的,然后总数减去不包含的即可

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

typedef long long ll;
const int N = 25;

int t;
char num[N];
ll dp[N][10], ans;

int main() {
	scanf("%d", &t);
	while (t--) {
		scanf("%s", num);
		int n = strlen(num);
		sscanf(num, "%I64d", &ans);
		ans++;
		int pre = 0, flag = 0;
		memset(dp, 0, sizeof(dp));
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < 10; j++) {
				for (int k = 0; k < 10; k++) {
					if (j == 9 && k == 4) continue;
					dp[i + 1][j] += dp[i][k];
				}
			}
			if (flag) continue;
			for (int j = 0; j < num[i] - '0'; j++) {
				if (j == 9 && pre == 4) continue;
				dp[i + 1][j]++;
			}
			if (pre == 4 && num[i] - '0' == 9) flag = 1;
			pre = num[i] - '0';
		}
		for (int i = 0; i < 10; i++) ans -= dp[n][i];
		ans -= !flag;
		printf("%I64d\n", ans);
	}
	return 0;
}

抱歉!评论已关闭.