题目链接

题意:问区间[n,m]中,不含数字4,也不含数字串“62”的所有数的个数。

思路:可以转化成求区间[0,x]

第一次接触数位dp,参考了这几篇博客。

不要62(数位dp)解题报告

解题报告2

解题报告3

比较重要的前提:

**¨对于一个小于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模板题,附带详细解释)的更多相关文章

  1. HDU 2089 不要62 数位DP模板题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 参考博客:https://www.cnblogs.com/HDUjackyan/p/914215 ...

  2. HDU 2089 - 不要62 - [数位DP][入门题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...

  3. hdu 2089 不要62 (数位dp基础题)

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. HDU 2089 不要62(数位dp模板题)

    http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求区间内不包含4和连续62的数的个数. 思路: 简单的数位dp模板题.给大家推荐一个好的讲解博客.h ...

  5. HDU 2089 不要62(数位DP&#183;记忆化搜索)

    题意  中文 最基础的数位DP  这题好像也能够直接暴力来做   令dp[i][j]表示以 j 开头的 i 位数有多少个满足条件 那么非常easy有状态转移方程 dp[i][j] = sum{ dp[ ...

  6. [hdu 2089] 不要62 数位dp|dfs 入门

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求[n, m]区间内不含4和62的数字个数. 这题有两种思路,直接数位dp和dfs 数位d ...

  7. Hdu 2089 不要62 (数位dp入门题目)

    题目链接: Hdu 2089 不要62 题目描述: 给一个区间 [L, R] ,问区间内不含有4和62的数字有多少个? 解题思路: 以前也做过这个题目,但是空间复杂度是n.如果数据范围太大就GG了.今 ...

  8. 【hdu6148】Valley Numer【数位dp模板题】

    题意 对于每组数据给出一个整数n(length(n)<=100),找出不大于n的数字中有多少是Valley Numer.对于Valley的定义是它每一位的数字要么是递增,要么是递减,要么是先递减 ...

  9. 51nod 1009 - 数字1的数量 - [数位DP][模板的应用以及解释]

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009 基准时间限制:1 秒 空间限制:131072 KB 给 ...

  10. hdu 2089 不要62 数位dp

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

随机推荐

  1. Codeforces Round #691 (Div. 2) D - Glass Half Spilled(DP)

    题目 补下因实验漏掉的CF(还以为是晚上,没想到是下午开始).前三题过的很顺利,到D题时想了会发现数据很小爆搜貌似能过,就以为是道水题,交了一发T了,胡乱加了点剪枝还是T.逐渐意识到事情的严重性.考虑 ...

  2. IDEA提示java_ 程序包org.apache.ibatis.session不存在

    一.解决方案 1.问题原因: 这是因为配置Java的程序包这块出现了错误,同时可能你还没有设置让IDEA自动加载Jar包,才会报出这种错误的. 2.解决方案: 解决方式如下: File->Set ...

  3. java中父类方法return this.对象还是变量,子类去调用this.这个方法的问题

    这个问题很简单 public class this_test01 { public static void main(String[] args) { zi j=new zi(); j.pri(); ...

  4. 生成模型的两大代表:VAE和GAN

    生成模型 给定数据集,希望生成模型产生与训练集同分布的新样本.对于训练数据服从\(p_{data}(x)\):对于产生样本服从\(p_{model}(x)\).希望学到一个模型\(p_{model}( ...

  5. 打造一个极度舒适的Chrome扩展项目开发环境

    大家好,我是 dom 哥.这是我关于 Chrome 扩展开发的系列文章,感兴趣的可以 点个小星星. Chrome 扩展能够提高浏览器的使用体验,通过自定义 UI 界面,监听浏览器事件,改变 Web 页 ...

  6. C++ Qt开发:自定义Dialog对话框组件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍自定义Dial ...

  7. python自动化测试相关资料

     java神功: https://yuedu.baidu.com/ebook/10f4bf7530126edb6f1aff00bed5b9f3f80f7212   selenium书:https:// ...

  8. Python——第三章:函数的返回值

    函数的返回值: 函数执行之后. 会给调用方一个结果. 这个结果就是返回值 关于return:        函数只要执行到了return. 函数就会立即停止并返回内容. 函数内的return的后续的代 ...

  9. 还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具

    之前写过一篇文章 我理想中的低代码开发工具的形态,已经吐槽了各种封装 xxxForm,xxxTable 的行为,这里就不啰嗦了.今天再来看看我的工具达到了什么程度. 多图预警... 以管理后台一个列表 ...

  10. 28、Flutter Key详解

    在Flutter中,Key是不能重复使用的,所以Key一般用来做唯一标识.组件在更新的时候,其状态的保 存主要是通过判断组件的类型或者key值是否一致.因此,当各组件的类型不同的时候,类型已经足够 用 ...