# 题目大意

给出 $\text{T}$ 个数,求 $[1,n]$ 中含 ‘49’ 的数的个数。

# 解题思路

求出不含 '49' 的数的个数,用总数减去就是答案。

数位 $DP$,用记忆化来做。

设 $dp[i][0]$ 表示 (这里按照从左往右数) 长度为 $i$ 并且最后一位不是 '4' 的数的个数。

设 $dp[i][1]$ 表示长度为 $i$ 并且最后一位是 '4' 的数的个数。

上面这两行看不懂可以先跳过去,是不是很神奇。

这样单说不好说。借助代码来说。具体的看代码里的注释。

# 放上代码

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long LL;
LL T, n, num[], cnt, dp[][];
inline void span(LL x) { //将数字张开分成一位一位
cnt = ;
while (x != ) {
num[++cnt] = x % ;
x /= ;
} //cnt就是长度
}
inline LL dfs(int l, bool flag, bool limit) { //枚举到了第l位,最高位是cnt
//flag表示前一位是否是4,limit表示枚举第l位是否存在限制
if(l == ) return ;
if(!limit && dp[l][flag]) return dp[l][flag];
//这里返回的原因是没有限制,所以这是一个通用的答案
LL ans = , mx = (limit ? num[l] : );
//这里这个mx是最大能枚举到几,如果这一位存在限制。
for(int i=; i<=mx; i++) {
if(flag && i == ) //判断是否含有‘49’
continue;
ans += dfs(l-, i == , i == mx && limit);
//如果这一位有限制并且现在枚举到的数正好达到最高限制,证明下一位也有限制
}
return limit ? ans : dp[l][flag] = ans;
//如果没有限制就可以将这个通用的答案记录下来
}
int main() {
scanf("%lld", &T);
while (T--) {
memset(num, , sizeof(num));
//这里记得要重置
scanf("%lld", &n);
span(n);
printf("%lld\n", n-(dfs(cnt, false, true)-));
//这里为什么要-1?
//因为在上面的函数中找到的不含‘49’的数包括‘0’,但是最后统计的时候是不包括‘0’的
}
}

「 HDU P3555 」 Bomb的更多相关文章

  1. Solution -「HDU 6875」Yajilin

    \(\mathcal{Description}\)   Link.(HDU 裂开了先放个私链 awa.)   在一个 \(n\times n\) 的方格图中,格子 \((i,j)\) 有权值 \(w_ ...

  2. Solution -「HDU 5498」Tree

    \(\mathcal{Description}\)   link.   给定一个 \(n\) 个结点 \(m\) 条边的无向图,\(q\) 次操作每次随机选出一条边.问 \(q\) 条边去重后构成生成 ...

  3. 「HDU - 2857」Mirror and Light(点关于直线的对称点)

    题目链接 Mirror and Light 题意 一条直线代表镜子,一个入射光线上的点,一个反射光线上的点,求反射点.(都在一个二维平面内) 题解 找出入射光线关于镜子直线的对称点,然后和反射光线连边 ...

  4. 「国庆训练」Bomb(HDU-5934)

    题意 给定\(n\)个炸弹,每个炸弹的坐标与代价与影响范围给定,炸弹会引爆影响范围内其他所有炸弹.求引爆所有炸弹的最小代价. 分析 先做\(n^2\)的循环,然后建图,对\(i\)能引爆\(j\)建边 ...

  5. 「 HDU P4734 」 F(x)

    # 题目大意 对于一个数 $x$,它的每一位数字分别是 $A_{n}A_{n-1}A_{n-2}\cdots A_{2}A_{1}$,定义其权重 $f(x)=\sum_{i=1}^{n}\left(A ...

  6. 「 HDU 1978 」 How many ways

    # 解题思路 记忆化搜索 一个点可以跳到的点,取决于它现在的能量.而且有一个显而易见的性质就是一条可行路径的终点和起点的横坐标之差加上纵坐标之差肯定小于等于起点的能量. 因为跳到一个点之后,能量和之前 ...

  7. 「 HDU P2089 」 不要62

    和 HDOJ 3555 一样啊,只不过需要多判断个 ‘4’ 我有写 3555 直接去看那篇吧 这里只放代码 #include <iostream> #include <cstring ...

  8. 「 HDU P3336 」 Count the string

    题目大意 给出一个长度为 $n$ 的字符串 $s$ 要求你求出 $s$ 的每一个前缀在 $s$ 中出现的次数之和.$n\le 200000$. 解题思路 暴力的对每一个前缀进行一次匹配,求出出现次数后 ...

  9. 「hdu 4845 」拯救大兵瑞恩 [CTSC 1999](状态压缩bfs & 分层图思想)

    首先关于分层图思想详见2004的这个论文 https://wenku.baidu.com/view/dc57f205cc175527072208ad.html 这道题可以用状态压缩,我们对于每一把钥匙 ...

随机推荐

  1. LeetCode——Regular Expression Matching

    Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...

  2. Python---NumPy模块---矩阵操作

    1.NumPy访问[数组&矩阵] 2.矩阵的运算 3.NumPy通用函数 4.NumPy矩阵的合并和分割 print "**********Numpy访问(数组&矩阵)*** ...

  3. java笔记线程方式2

    方式2:实现Runnable接口 * 步骤: *   A:自定义类MyRunnable实现Runnable接口 *   B:重写run()方法 *   C:创建MyRunnable类的对象 *   D ...

  4. Yii2-redis安装配置

    编辑composer.json文件 vim composer.json 加入"yiisoft/yii2-redis": "~2.0.0" 执行更新 compos ...

  5. Rails5 radio_button

    容易错,集中记下来 首先是radio button的三种形式  函数名  参数意义  radio_button_tag(prop, value [, opts])  prop: radio的属性  v ...

  6. 例题 3-5 谜题 uva227 Puzzle

    A children’s puzzle that was popular years ago consisted of a × frame which contained small squares ...

  7. C语言小项目-火车票订票系统

    list.h #ifndef __LIST_H__ #define __LIST_H__ #include "stdafx.h" #include <stdio.h> ...

  8. EditText(4)常用属性详解

    常用的属性: 显示密码 通过设置EditText的setTransformationMethod()方法来实现隐藏密码或这显示密码. editText.setTransformationMethod( ...

  9. 使用JS分页 <span> beta 2.0 未封装的分页

    <html> <head> <title>分页</title> <style> #titleDiv{ width:500px; backgr ...

  10. 上传txt文件编码格式判断(文本乱码解决方法)

    说明 通过ajax或者浏览上传文本文件,上传时候c#处理时候因为文本格式的创建不同,在获取内容时候会出现中文乱码. 解决方法 通过上传的文件流,判断文件的编码格式,在使用对应的编码格式获取文本内容 # ...