码迷,mamicode.com
首页 > 其他好文 > 详细

HDU - 3555

时间:2018-06-02 18:38:17      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:its   define   memset   return   pre   family   std   --   alc   

题意:数字中含有49的数字个数。

总结:dp[l][if4]表示当前还剩l位,上一位是否为4

判断时若上一位为4且这一位为9,不必再dfs,直接加上一个值就好

#include <bits/stdc++.h>

using namespace std;
const int maxn = 30 + 5;
#define ll long long

ll dight[maxn], dp[maxn][2], tot, T, z[maxn], n;

ll dfs(int l, bool if4, bool sig) {
	if(l == 0) return 0;
	if(!sig && dp[l][if4] != -1) return dp[l][if4];
	int nex = sig ?dight[l] :9; ll res = 0;
	for (int i = 0; i <= nex; ++i) {
		if(if4 && i == 9) res += sig ?n % z[l - 1] + 1 :z[l - 1];//加1是因为后面可以全为0 
		else res += dfs(l - 1, i == 4, sig && (i == nex));
	}
	if(!sig) dp[l][if4] = res;
	return res;
}
ll calc(ll a) {
	tot = 0;
	while(a) {
		dight[++tot] = a % 10; a /= 10;
	} 
	return dfs(tot, 0, 1);
}
int main() {
	scanf("%lld", &T); z[0] = 1;
	for (int i = 1; i <= 20; ++i) z[i] = z[i - 1] * 10;
	while(T--) {
		memset(dp, -1, sizeof dp);
		scanf("%lld", &n);
		printf("%lld\n", calc(n));
	}
	return 0;
}

  

 

HDU - 3555

标签:its   define   memset   return   pre   family   std   --   alc   

原文地址:https://www.cnblogs.com/oi-forever/p/9126049.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!