【HDU2089】不要62
题目大意:求区间 [n,m] 中数位不包含 4 和 62 的数字的个数。
题解:数位dp。
预处理出 \(f[i][j]\) 表示 i 位数字中以 j 为第一位的满足条件的数字个数。
对于统计答案来说采用前缀和相减的方式,即:统计出 [0,m] 中有多少满足条件的数减去 [0,n-1] 中满足条件的数字个数即可。
对于求 [0,n] 中满足条件的个数来说,将原问题划分为若干子问题,每个子问题为从第 i 位开始小于 n 的合法数字的个数,显然划分出的子问题不重不漏,因此子问题的方案数的累加即是原问题的方案数。
注意:根据子问题划分可以发现,统计出来的方案数是小于 n 的方案数,即:不包括 n。因此,前缀和相减时要注意是 g[0,m+1] - g[0,n],g 为统计出的方案数。
代码如下
#include <bits/stdc++.h>
using namespace std;
int n,m,f[8][10],digit[10],tot;
void init(){
f[0][0]=1;
for(int i=1;i<=7;i++)
for(int j=0;j<=9;j++)
for(int k=0;k<=9;k++)
if(j!=4&&!(j==6&&k==2))
f[i][j]+=f[i-1][k];
}
inline void get(int x){
tot=0;
memset(digit,0,sizeof(digit));
while(x)digit[++tot]=x%10,x/=10;
}
int calc(int x){
get(x);
int ret=0;
for(int i=tot;i;i--){
for(int j=0;j<digit[i];j++)
if(j!=4&&!(j==2&&digit[i+1]==6))
ret+=f[i][j];
if((digit[i]==2&&digit[i+1]==6)||digit[i]==4)break;
}
return ret;
}
int main(){
init();
while(scanf("%d%d",&n,&m)&&n&&m){
printf("%d\n",calc(m+1)-calc(n));
}
return 0;
}
update on 5.25
数位 dp 的迭代版本细节过多,因此斟酌之后,目前采用递归版。
递归版需要注意的点如下:
- 递归到边界处意味着生成了一个合法的数字,需要返回数字对答案的贡献。
- 递归版本的 dp 值个人感觉没有迭代版本的 dp 含义清晰,不过 dp 的定义一定要保证和搜索框架中传入的参数个数相等,除了 limit 和 lead 位。
- 在判断是否有前导零的时候,尽量在每种情况中讨论符合情况的转移,即:不要将转移的判断条件写在所有转移的前面,这样可能会导致丢解漏解。
- 递归版的优势在于可以很好地处理前导零问题,以及得到的解是区间 [1,n] 的解,与迭代版 [1,n) 不同。
代码如下
#include <bits/stdc++.h>
using namespace std;
int dp[10][10];
int digit[10],tot;
int dfs(int cur,int pre,bool lead,bool limit){
if(!cur)return 1;
if(!lead&&!limit&&dp[cur][pre]!=-1)return dp[cur][pre];
int ret=0;
int bit=limit?digit[cur]:9;
for(int i=0;i<=bit;i++){
if(i==4||(pre==6&&i==2))continue; // 尽量不要将判断条件写在这里,应写在下面每个判断语句中(懒得改了这里
if(!i&&lead)ret+=dfs(cur-1,i,1,limit&&i==bit);
else ret+=dfs(cur-1,i,0,limit&&i==bit);
}
if(!limit&&!lead)dp[cur][pre]=ret;
return ret;
}
int part(int x){
tot=0;
memset(digit,0,sizeof(digit));
do{
digit[++tot]=x%10;
x/=10;
}while(x);
memset(dp,-1,sizeof(dp));
return dfs(tot,0,1,1);
}
int main(){
int n,m;
while(scanf("%d%d",&n,&m)&&n+m){
printf("%d\n",part(m)-part(n-1));
}
return 0;
}
【HDU2089】不要62的更多相关文章
- [HDU2089]不要62
[HDU2089]不要62 试题描述 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就 ...
- 数位dp入门 hdu2089 不要62
数位dp入门 hdu2089 不要62 题意: 给定一个区间[n,m] (0< n ≤ m<1000000),找出不含4和'62'的数的个数 (ps:开始以为直接暴力可以..貌似可以,但是 ...
- [您有新的未分配科技点]数位dp:从懵X到板子(例题:HDU2089 不要62)
数位dp主要用来处理一系列需要数数的问题,一般套路为“求[l,r]区间内满足要求的数/数位的个数” 要求五花八门……比如“不出现某个数字序列”,“某种数的出现次数”等等…… 面对这种数数题,暴力的想法 ...
- HDU2089 不要62[数位DP]
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu2089不要62(数位dp)
#include <stdio.h> #include <string.h> ][]; ]; /* dp[i][0] 不含62,4 dp[i][1] 2开头 dp[i][2] ...
- ☆ [HDU2089] 不要62「数位DP」
类型:数位DP 传送门:>Here< 题意:问区间$[n,m]$的数字中,不含4以及62的数字总数 解题思路 数位DP入门题 先考虑一般的暴力做法,整个区间扫一遍,判断每个数是否合法并累计 ...
- HDU2089 ------不要62(数位dp)
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- 【数位dp】hdu2089 不要62
http://www.cnblogs.com/xiaohongmao/p/3473599.html #include<cstdio> using namespace std; int n, ...
- [暑假集训--数位dp]hdu2089 不要62
杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍, ...
- HDU2089 不要62 —— 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 不要62 Time Limit: 1000/1000 MS (Java/Others) M ...
随机推荐
- Python基本语法_函数_参数的多类型传值
前言 上一篇主要介绍了Python函数的参数类型,本篇继续学习Python函数多类型传值. 目录 前言 目录 软件环境 参数的多类型传值 向函数传递Tuple 向函数传递List 向函数传递Dicti ...
- Python基本语法_函数属性 & 参数类型 & 偏函数的应用
目录 目录 前言 软件环境 Python Module的程序入口 函数的属性 Python函数的创建 函数的参数 必备参数 缺省参数 命名参数 不定长参数 匿名参数 偏函数的应用 前言 Python除 ...
- 四十五:数据库之SQLAlchemy之subquery实现复杂查询
子查询让多个查询变成一个查询,只需要查找一次数据库,性能相对来讲更高效,不用写多个SQL语句就可以实现一些复杂的查询,在SQLAlchemy中要实现一个子查询,应该使用以下步骤:1.将子查询按照传统方 ...
- RTX系统整合记录
1.切换数据库RTX常见问题解答五. SQL数据库配置 2.同步系统组织机构 部门同步 用户同步https://blog.csdn.net/qq_21703215/article/details/80 ...
- Windows 上第一款全局轮盘菜单软件(鼠标党进)
哈哈,我又来了. 如果之前已经有人做过了类似的,估计也没我做的好,反正我是没有见到过的
- 【HANA系列】SAP HANA SLT在表中隐藏字段并传入HANA的方法
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SLT在表中隐 ...
- Django的Mov逻辑的管理特色
Django的MOV逻辑的管理特色 首先我们谈论到一个逻辑上的概念都从它的起点说起,在我看来mov的起点肯定就是Model了,那么Model有什莫特色呢 如果一个项目定义的Django那么Django ...
- docker面试总结
1.什么是docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化.容 ...
- 完全分布式部署Hadoop
完全分布式部署 Hadoop 分析: 1)准备 3 台客户机(关闭防火墙.静态 ip.主机名称) 2)安装 jdk 3)配置环境变量 4)安装 hadoop 5)配置环境变量 6)安装 ssh 7)配 ...
- 将Lambda表达式作为参数传递并解析-在构造函数参数列表中使用Lambda表达式
public class DemoClass { /// <summary> /// 通过Lambda表达式,在构造函数中赋初始值 /// </summary> /// < ...