【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 ...
随机推荐
- 阶段3 2.Spring_06.Spring的新注解_8 spring整合junit完成
Junit的核心Runner在执行的时候不会创建容器.同时它字节码文件,也改不了 spring整合junit 想办法把junit里面的不能加载容器的main方法换掉.从而实现创建容器.有了容器就可以实 ...
- 437路径总和III
题目: 给定一个二叉树,它的每个结点都存放着一个整数值.找出路径和等于给定数值的路径总数.路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点).来源: ht ...
- PyCharm安装+破解
PyCharm 是一款功能强大的 Python 编辑器,具有跨平台性,鉴于目前最新版 PyCharm 使用教程较少,为了节约时间,来介绍一下 PyCharm 在 Windows下是如何安装的. 这是 ...
- 我们公司的delphi代码(胆不是我写的!),看看,你觉得怎么样
unit unt_LotBill_dyc; interface uses windows, SysUtils, Classes, ComCtrls, Forms, Controls, StrUtils ...
- 【VS开发】使用 NuGet 管理项目库
NuGet 使用 NuGet 管理项目库 Phil Haack 无论多么努力,Microsoft 也没办法提供开发人员所需要的每一个库. 虽然 Microsoft 在全球的员工人数接近 90,000, ...
- 深入理解java:4.1. 框架编程之Spring MVC
说到java的mvc框架,struts2和springmvc想必大家都知道, Spring MVC是当前最优秀的MVC框架,自从Spring 2.5版本发布后,由于支持注解配置,易用性有了大幅度的提高 ...
- oracle 11g sqlplus和plsql developer 乱码解决方案
----------------------------------华丽的分隔符---------------------------------- 在cmd终端下运行 中文的话 ...
- No repository found containing: …错误解决
由于我安装的是Eclipse ForJava Development,无JAVA EE,查找资料后发现可以自己在已有软件的基础上配置,总结如下: >>>>>点开之后,找到 ...
- mysql标准规范
一.基础规范 表存储引擎必须使用InnoDB 表字符集默认使用utf8,必要时候使用utf8mb4 解读: (1)通用,无乱码风险,汉字3字节,英文1字节 (2)utf8mb4是utf8的超集,有存储 ...
- Linux内核基础优化
Linux内核基础优化 net.ipv4.ip_forward = 1 #开启网络转发 net.ipv4.conf.default.rp_filter = 0 #开启代理功能 net.ipv4.con ...