#2089: 不要62 (数位dp模板题,附带详细解释)
题目链接
题意:问区间[n,m]中,不含数字4,也不含数字串“62”的所有数的个数。
思路:可以转化成求区间[0,x]
第一次接触数位dp,参考了这几篇博客。
比较重要的前提:
**¨对于一个小于n的数,肯定是从高位到低位出现某一位
¨如 n = 58 n为十进制数。
**¨ x = 49 此时x的十位
**¨ x = 51 此时x的个位
**¨有了上述性质,我们就可以从高到低枚举第一次
这样之前的位确定了,之后的位就不受n的限制即从00…0~99…9,可以先预处理
以及写成递归形式代码会简洁很多,所以就写了递归形式。
更详细的解释参加代码注释。
#include<bits/stdc++.h>
#define fst first
#define sec second
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ms(a,x) memset(a,x,sizeof(a))
typedef long long LL;
#define pi pair < int ,int >
#define MP make_pair
using namespace std;
const double eps = 1e-8;
const int dx[4] = { 1,0,0,-1 };
const int dy[4] = { 0,1,-1,0 };
const int inf = 0x3f3f3f3f;//1061109567
int n, m;
int dp[30][2];
int digit[30];
int dfs(int pos, bool preis6, bool limit) {//pos表示从低到高的第几位,是从高位往低位递归的(也就是从左到又)
// preis6 表示上一个数字是否为6,
// limit表示该位置是否有限制。
//cout<<pos<<" "<<preis6<<" "<<limit<<" "<<endl;
if (!pos)return 1;//到该位置表明找到了一个解.
int res = 0;
//如果不是limit位置,表示结果是通用的,而之前又算过的话,就可以直接调用这个结果。
if (!limit && dp[pos][preis6] != -1)return dp[pos][preis6];
//mx第pos位置能取到的最大的数字..如果不是limit,则可以0..9任意取。
int mx = limit ? digit[pos] : 9;
//cout<<"mx:"<<mx<<endl;
for (int i = 0; i <= mx; i++)
{
if (i == 4 || (i == 2 && preis6)) continue;
res += dfs(pos - 1, i == 6, limit&&i == mx);
//(limit&&i==mx)中limit的含义是。。如果当前一位不是limit位(即0..9可以随便取的位置)
//,那么之后的位置也一定不是limit位置。
//而i==mx部分的意思是,在当前位置的数字小于当前位置的数字能取的最大值(mx)之前,
//后面位的数字随便取也不会超过上界。
}
if (!limit) dp[pos][preis6] = res; //记忆化. 非limit位的结果才通用,不然没必要存。
return res;
}
int solve(int n) {
ms(digit, 0);
int len = 0;
//将数按照每一位存到digit数组中
while(n) {
digit[++len] = n % 10;
n /= 10;
}
return dfs(len, false, true);
}
int main() {
ios::sync_with_stdio(false);
while (cin >> n >> m && n&& m) {
ms(dp, -1);
int ans = solve(m) - solve(n - 1);
cout << ans << endl;
}
return 0;
}
#2089: 不要62 (数位dp模板题,附带详细解释)的更多相关文章
- HDU 2089 不要62 数位DP模板题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 参考博客:https://www.cnblogs.com/HDUjackyan/p/914215 ...
- HDU 2089 - 不要62 - [数位DP][入门题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...
- hdu 2089 不要62 (数位dp基础题)
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 2089 不要62(数位dp模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求区间内不包含4和连续62的数的个数. 思路: 简单的数位dp模板题.给大家推荐一个好的讲解博客.h ...
- HDU 2089 不要62(数位DP·记忆化搜索)
题意 中文 最基础的数位DP 这题好像也能够直接暴力来做 令dp[i][j]表示以 j 开头的 i 位数有多少个满足条件 那么非常easy有状态转移方程 dp[i][j] = sum{ dp[ ...
- [hdu 2089] 不要62 数位dp|dfs 入门
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求[n, m]区间内不含4和62的数字个数. 这题有两种思路,直接数位dp和dfs 数位d ...
- Hdu 2089 不要62 (数位dp入门题目)
题目链接: Hdu 2089 不要62 题目描述: 给一个区间 [L, R] ,问区间内不含有4和62的数字有多少个? 解题思路: 以前也做过这个题目,但是空间复杂度是n.如果数据范围太大就GG了.今 ...
- 【hdu6148】Valley Numer【数位dp模板题】
题意 对于每组数据给出一个整数n(length(n)<=100),找出不大于n的数字中有多少是Valley Numer.对于Valley的定义是它每一位的数字要么是递增,要么是递减,要么是先递减 ...
- 51nod 1009 - 数字1的数量 - [数位DP][模板的应用以及解释]
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009 基准时间限制:1 秒 空间限制:131072 KB 给 ...
- hdu 2089 不要62 数位dp
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
随机推荐
- 使用React+SpringBoot开发一个协同编辑的表格文档
本文由葡萄城技术团队发布.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 随着云计算和团队协作的兴起,协同编辑成为了许多企业和组织中必不可少的需求.通 ...
- JAVA学习week2
这周:根据老师在群里面推荐的JAV学习路线,初步规划了一下学习方案 并找到了相关的视频,目前来说在学习SE.学习内容:环境变量的配置和简单的hello world程序书写的注意点 下周:打算进行简单的 ...
- 【Javaweb】五(Service类)
一般Spring项目中处理业务的层为Service层,称为业务层.目前常见的风格有: 写法:Service层=Service接口+ServiceImpl实现类 AdminServiceImpl.jav ...
- Hdu4742 (CDQ分治)
题意:给出n个三维点对(x,y,z),可随意排列,求三维非严格最长上升子序列长度和最长上升子序列数量. 输入格式:第一行为一整数T表示用例组数,每组用例第一行为一整数n表示点数,之后n行每行三个整数x ...
- MarkdownPad 文件访问权限受限导致软件打开后不久闪退解决方法
近几天发现MarkdownPad有一些小问题,打开时会弹出以下报错信息,告诉你打开文件的权限不够 解决方法如下: 1.复制报错信息中的文件路径"Access to the path 'C:\ ...
- MySQL笔记01: MySQL入门_1.2 MySQL下载安装与配置
2.2 MySQL下载安装与配置 2.2.1 MySQL下载 MySQL中文官网:https://www.mysql.com/cn/ MySQL英文官网:https://www.mysql.com/ ...
- Socket是什么/怎么理解Socket
Socket 先来看一下百度百科对于Socket的介绍:套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开.读写和关闭等操作.套接字允许应用程序将I/O ...
- 零基础 从 yolo8 入门计算机视觉超简单:物体识别、图像分类、轨迹追踪、姿势识别
目录 安装 Ultralytics 训练 模型验证 预测 & 识别 导出 追踪 图像分割提取 分类 姿势识别 轨迹生成 Ultralytics YOLOv8 是备受好评的实时目标检测和图像分割 ...
- Tensorflow2.0实战之Auto-Encoder
autoencoder可以用于数据压缩.降维,预训练神经网络,生成数据等等 Auto-Encoder架构 需要完成的工作 需要完成Encoder和Decoder的训练 例如,Mnist的一张图片大小为 ...
- Bert-vits2-v2.2新版本本地训练推理整合包(原神八重神子英文模型miko)
近日,Bert-vits2-v2.2如约更新,该新版本v2.2主要把Emotion 模型换用CLAP多模态模型,推理支持输入text prompt提示词和audio prompt提示语音来进行引导风格 ...