数位dp,主要用来解决统计满足某类特殊关系或有某些特点的区间内的数的个数,它是按位来进行计数统计的,可以保存子状态,速度较快。数位dp做多了后,套路基本上都差不多,关键把要保存的状态给抽象出来,保存下来。

简介:

顾名思义,所谓的数位DP就是按照数字的个,十,百,千……位数进行的DP。
数位DP的题目有着非常明显的性质:

询问[l,r]的区间内,有多少的数字满足某个性质

做法根据前缀和的思想,求出[0,l-1][0,r]中满足性质的数的个数,然后相减即可。

算法核心:

关于数位DP,貌似写法还是比较多的,有递归的,也有非递归的。
下面学习一下较好理解,可拓展性较高的递归写法。

LL dfs(int x,int pre,int bo,int limit);

一般需要以上参数(当然具体情况具体分析)。

  • x表示当前的数位(一般都是从高位到低位
  • pre表示前一位的数字
  • bo可以表示一些附加条件:是否有前项0,是否包含49,是否当前已经符合条件……
  • limit这个很重要!它表示当前数位是否受到上一位的限制,比较抽象,举例说明
    如果上限是135,前两位已经是1和3了,现在到了个位,个位只能是5以下的数字

注:如果当前受限,不能够记忆化,也不能返回记忆化的结果
为了避免多次调用时 每次上限不同 而导致的错乱影响

例题:HDU 3555

题意:a到b中有多少个数字包含49

思路:

dfs(x,pre,bo,limit)
表示当前位置,前一位的数字,当前是否已经包含49,以及是否有上界
当然,直接搜索肯定TLE,f[x][pre][bo]记忆化即可。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N = 20;
#define LL long long
int dig[N];
LL f[N][10][2];
//  数位,前一位数,是否符合条件,是否符合限制 [从高位到低位处理]
LL dfs(int x, int pre, int bo, int limit){if (x < 0) return bo; // 已经枚举了最后一位if (!limit && f[x][pre][bo] != -1) return f[x][pre][bo]; // 记忆化dpint last = limit ? dig[x] : 9; // 确定这一位的上限是多少LL re = 0;for (int i = 0; i <= last; i++)re += dfs(x - 1, i, bo || (pre == 4 && i == 9), limit && (i == last));if (!limit) f[x][pre][bo] = re; // 当前受限,不能够记忆化,也不能返回记忆化的结果return re;
}
LL solve(LL n){int len = 0;while (n){dig[len++] = n % 10;n /= 10;}return dfs(len - 1, 0, 0, 1);
}
int main(){memset(f, -1, sizeof(f));int T; scanf("%d", &T);while (T--){LL n;cin >> n;cout << solve(n) << endl;}return 0;
}

转载于:https://www.cnblogs.com/demian/p/7442215.html

HDU 3555 Bomb (数位DP)相关推荐

  1. HDU - 3555 Bomb(数位dp)

    题目链接:点击查看 题目大意:给定一个整数n,求从1到n的闭区间内含有相邻"49"的数字的个数. 题目分析:裸的数位dp,这里说一下两种做法,第一种是正着求,也就是求含有49的数字 ...

  2. Bomb HDU - 3555【数位dp】

    Bomb HDU - 3555 The counter-terrorists found a time bomb in the dust. But this time the terrorists i ...

  3. HDU 3555 Bomb (数位DP-记忆化搜索模板)

    题意 求区间[1,n]内含有相邻49的数. 思路 比较简单的按位DP思路.这是第一次学习记忆化搜索式的数位DP,确实比递推形式的更好理解呐,而且也更通用~可以一般化: [数位DP模板总结] int d ...

  4. HDU 3555 Bomb(数位DP模板啊两种形式)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 Problem Description The counter-terrorists found ...

  5. HDU 3555 - Bomb

    第一道数位dp,属于基础模板,又自卑小时没学好数数了,只是不清楚为什么大家的dp定义都是相同的,很显然么,难道我写的是怪胎... /* ID:esxgx1 LANG:C++ PROG:hdu3555 ...

  6. HDU 3555: Bomb

    ///@link http://acm.hdu.edu.cn/showproblem.php?pid=3555///@author Sycamore///@date Sep, 14///@ref ku ...

  7. HDU 3652 B-number (数位DP)

    Description 统计区间\([1,n]\)中是\(13\)的倍数且数字中含有"13"的数的个数. Input 多组用例,处理到文件尾.每组用例给出一个整数\(n\).\(1 ...

  8. 【hdu3555】Bomb 数位dp

    题目描述 求 1~N 内包含数位串 "49" 的数的个数. 输入 The first line of input consists of an integer T (1 <= ...

  9. HDU - 6899 Xor(数位dp)

    题目链接:点击查看 题目大意:给出四个整数 A , B , K , W ,问满足下列条件的二元对的个数: x , y 是整数 x <= A , y <= B abs( x - y ) &l ...

最新文章

  1. 解决cocos2dx 3.x 导入cocostudio的ui界面出现错位问题
  2. ASP.NET 实现站内信功能(点对点发送,管理员群发)
  3. MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本
  4. 华为呼叫中心解决方案学习笔记一(方案概述)
  5. mac安装brew简单方法
  6. 【python】有意思的python小项目GitHub地址汇总
  7. vs矩形框边框线显示被选中的区域;_条形码区域解码:Web小工具
  8. frameset嵌套多个html,在一个html的js中调用另一个html的变量和函数(导航栏更新个人图标)
  9. 网易2016游戏技术岗在线编程题(二)
  10. GeoDa空间自相关分析和计量模型的权重问题
  11. 科来网络分析工具基本操作与案例分析
  12. MatLab中多项式数据拟合(ployfit函数与polyval函数)
  13. 多个文件的文件名简体中文转换成繁体中文的简单操作
  14. QT5.14.2使用webkit引擎完成网页浏览
  15. 【3D音效增强神器】Boom 3D for Mac中文版 v1.2.2
  16. Android之黄油刀(butterknife)
  17. 520还在画玫瑰?教你用MATLAB画个玫瑰花球
  18. Docker 网络(十一)——Docker Multi-host Network
  19. angularjs结合plupload实现文件上传
  20. 视频监控存储特点分析

热门文章

  1. pytest框架_Python最火的第三方开源测试框架——pytest
  2. 华为配备鸿蒙系统的手机,华为P50/新平板双双来袭!全球首发鸿蒙系统:配置都非常强悍...
  3. golang web php,GitHub - kai-xx/goWeb: golang web 接口实现 -- 类似PHP的laravel
  4. python输入代码如何清除_Bug清除手册-代码书写规范与基本使用(Python)
  5. 电视光端机常见故障问题介绍
  6. 【渝粤教育】国家开放大学2018年秋季 0653-21T机电控制与可编程控制技术 参考试题
  7. 【渝粤教育】国家开放大学2018年春季 0609-21T中级财务会计(1) 参考试题
  8. 【渝粤教育】电大中专新媒体营销实务 (7)作业 题库
  9. 【渝粤题库】陕西师范大学201001 教育管理学(高起本)作业
  10. 【渝粤题库】国家开放大学2021春2517社区工作题目