HDU 3555 Bomb (数位DP)

数位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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java rsa 117_java实现RSA非对称加密解密

之前写过一篇java实现AES对称加密解密在对密码加密传输的场景下 RSA非对称加密解密可能会更加适合。原理就是后台生成一对公钥和私钥&#xff0c;公钥给前端用来加密&#xff0c;后台用私钥去解密&#xff0c;保证了传输过程中就算被截获也避免密码泄露。下面是代码&#xff1a…

CodeForces 731C Socks

//并查集的应用 #include <bits/stdc.h> using namespace std; const int N 2e5 5; int f[N]; int color[N]; vector<int>num[N]; int findx(int x) {return ( x f[x]? x: f[x] findx(f[x]) ); } void merge(int x, int y) {int fx findx(x);int fy findx(y…

php多条件筛选顺序_php多条件组合筛选

【实例简介】js搞定多条件组合筛选&#xff0c;实现URL动态变化&#xff0c;后台根据URL参数实现查询【实例截图】【核心代码】filter└── filter├── css│ ├── bootstrap.css│ ├── bootstrap.css.map│ ├── bootstrap.min.css│ ├── bootstrap-resp…

jdeveloper_JDeveloper中的Java反编译器

jdeveloperJava Decompiler是一个独立的图形实用程序&#xff0c;显示“ .class”文件的Java源代码。 下面是Java Decompiler程序的快照 您可以从这里下载该程序 我将说明如何在Jdeveloper中将此程序用作外部工具 Java Decompiler和Jdeveloper之间的集成 您可以将此程序添加…

文件上传 java 完美,vue+java实现文件上传(excel等),会出现跨域问题,直接用form表单提交就不会有问题了(new FormData())...

vuejava实现文件上传(excel等)&#xff0c;会出现跨域问题&#xff0c;直接用form表单提交就不会有问题了(new FormData())地址&#xff1a;https://www.cnblogs.com/muscles/p/9503103.html一&#xff1a;首先说一下什么是跨域&#xff0c;跨域就是解决浏览器同源策略的问题。…

abp的权限与导航菜单的关系

原来以为各是各的,所以就有了第一个版本.Getallmentus.然后注入了role,当然失败了.获取所有的菜单.一直在思考在什么地方设置菜单是否展示呢? 后面看了源码.才发现自己错了. UserNavigationManager(这个是一个框架内部调用的类)会获取当前userid的所有的菜单, 数据源跟菜单的R…

通过Java 8流使用Oracle AQ

Oracle数据库最令人敬畏的功能之一是Oracle AQ&#xff1a;Oracle数据库高级队列 。 AQ API直接在数据库中实现了完整的事务性消息传递系统。 在数据库位于系统中心的经典体系结构中&#xff0c;使用AQ进行进程间通信时&#xff0c;多个应用程序&#xff08;其中一些应用程序用…

藏经阁

藏经阁 收藏经典书籍&#xff0c; 文学 1.霍乱时期的爱情 2.巨人的陨落 3.群山之巅 4.无人生还 5.加缪文集&#xff0c;1995&#xff0c;译林出版 6.1984 7.黄金时代 8.太阳照常升起 9.月亮和六便士 10.白夜行 11.小王子 12.杀死一只知更鸟 社科 1.高效能人士的七个习惯 2.少有…

php private方法,php如何调用private方法

php调用private方法&#xff1a;首先定义一个parent类&#xff1b;然后在类的内部使用私有函数&#xff1b;接着实例化parent类&#xff0c;让其变成一个对象并赋值给“$obj”即可。将一个类实例化后就变成对象&#xff0c;私有函数只能在类内部使用&#xff0c;不能在类外&…

Centos7 开启端口

CentOS7默认没有使用iptables&#xff0c;所以通过编辑iptables的配置文件来开启80端口是不可以的。 CentOS 7 采用了 firewalld 防火墙。 如要查询是否开启80端口&#xff1a; [rootjoe-pc ~]# firewall-cmd --query-port80/tcp no 显然80端口没有开启。 下面我们开启80端口&a…

java flux api,SpringBoot学习系列-WebFlux REST API 全局异常处理

本文内容为什么要全局异常处理&#xff1f;WebFlux REST 全局异常处理实战小结摘录&#xff1a;只有不断培养好习惯&#xff0c;同时不断打破坏习惯&#xff0c;我们的行为举止才能够自始至终都是正确的。一、为什么要全局异常处理&#xff1f;前后端分离开发&#xff0c;一般提…

使您的Java 8方法引用生效

方法参考 众所周知&#xff0c;我们可以使用Java 8中的方法引用 &#xff08;例如String::isEmpty来引用例如在元素上流式传输时使用的方法。 看一下以下代码片段&#xff1a; Stream.of("A", "", "B").filter(Stream::isEmpty).count();它将产…

down.php无法打开,php下载文件 图片不能打开,该怎么解决

php下载文件 图片不能打开function fileDown($file_name){$file_name iconv("utf-8","gb2312",$file_name);$file_path "E:/php/down/".$file_name;if(!file_exists($file_path)){echo "文件不存在";return;}$fp fopen($file_path,…

【转】Linux如何在系统启动时自动加载模块

1、Linux安装驱动程序 tar zxf ixgbe-<x.x.x>.tar.gz cd ixgbe-<x.x.x>/src/ make install modprobe <ixgbe> 卸载驱动 cd ixgbe-<x.x.x>/src/ make uninstall 2、Linux如何在系统启动时自动加载模块 原文&#xff1a;http://www.cnblogs.com/image-ey…

MATLAB小记_fread的用法

“fread”以二进制形式&#xff0c;从文件读出数据。语法1&#xff1a;[a,count]fread(fid,size,precision)语法2&#xff1a;[a,count]fread(fid,size,precision,skip)size: 不指定 &#xff1a;到尾返回读。N : 读出N个数据&#xff0c;构成列向量。inf …

mvvm 后端_ZK实际应用:MVVM –与ZK客户端API一起使用

mvvm 后端在以前的文章中&#xff0c;我们已经使用ZK的MVVM实现了以下功能&#xff1a; 将数据加载到表中 使用表单绑定保存数据 删除条目并以编程方式更新视图 ZK MVVM和ZK MVC实现方式之间的主要区别是&#xff0c;我们不直接在controller&#xff08;ViewModel&#xff0…

微信分享朋友圈固定缩略图 php,微信转发或分享朋友圈带缩略图、标题和描述的实现方法...

自己做博客以来&#xff0c;很早之前分享过文章至朋友圈&#xff0c;那个时候分享过去的文章自动获取页面的比例适合的图片为所缩略图&#xff1a;后期就很少分享至朋友圈&#xff0c; 近来分享文章给朋友后&#xff0c;发现不带缩略图和简介了&#xff0c;觉得这样很不好看&am…

Oracle 用户、表空间、授权、备份、导入等操作相关

一、基础操作 闲来无事&#xff0c;整理oracle数据库相关操作&#xff0c;以后备用。。。。。 ps&#xff1a; satp 为用户 satp_data 为表空间 1 1.删除表空间2 DROP TABLESPACE satp_data INCLUDING CONTENTS AND DATAFILES;3 4 2.删除用户5 drop user satp cascade;6 …

看一下即将发布的JSF 2.3 Push支持

如前几篇文章所述&#xff0c;下一版本的JavaServer Faces&#xff08;Mojarra&#xff09;已添加了许多增强功能。 JSF 2.3计划于2017年与Java EE 8一起发布&#xff0c;但是您现在可以通过从源代码构建或运行里程碑版本来尝试JSF的一些增强和更新&#xff0c;以进行测试。 对…

java mvc中重复提交表单,spring mvc 防止重复提交表单的两种方法,推荐第二种

第一种方法&#xff1a;判断session中保存的token比较麻烦&#xff0c;每次在提交表单时都必须传入上次的token。而且当一个页面使用ajax时&#xff0c;多个表单提交就会有问题。注解Token代码&#xff1a;package com.thinkgem.jeesite.common.repeat_form_validator;import j…