数位dp简介:

数位dp常用于求区间内某些特殊(常关于数字各个数位上的值)数字(比如要求数字含62,49);

常用解法:

数位dp常用记忆化搜索或递推来实现;

由于记忆化搜索比较好写再加上博主比较蒟,所以本文基本只介绍用记忆化搜索实现的数位dp;

记搜写法:

一般记搜写法会暴力搜索每个数的每一位,如果满足特征就加入答案;

而搜索中或搜完后用一个dp数组来存某一区间的特殊数的数量,防止多次重复搜索TLE;

空口说比较苍白无力,举个例子:比如要在1到r中找含49(4和9要连在一起)的特殊数的数量;

搜索时,传递当前要填的数字在数中的位置(pos),上一个填的数值(pre),之前有没有出现49(have),以及填的数有没有限制(limit);

pos用来观察这个数有几位,有没有达到范围;

pre用来判断之前的数是不是4,从而来判断如果当前位填9,是否能出现49

have用记录是否出现 49,在搜的过程中就可以记录特殊数的数量;

limit的作用是防止数过大超过范围(具体操作见下文例题);

dp[pos][pre]存当当前要填的数的位置为pos,上一个数为pre时特殊值的数量;

例题(hdu3555):

题目大意是给出n,给出n个范围1—r,输出每个范围中含49的数的数量

思路就是上面的例子,这里仔细介绍一下limit的用法;

比如r=1234,当pos=3(pos=1时是个位,从第一位开始搜),如果pre=1,那么这一位就只能填0—2了,limit就是记录之前填的数和上界是否相同,而传递也很简单,如果limit=true而且当前要填的数等于给定范围的pos位上的数时,limit仍然是true,否则就是false;

注意!

1、数位dp基本上的题都要开long long,不然暴力就能过了;

2、具体题目时要注意dp的含义防止重复加;

下面附上丑陋的代码:

 #include<cstdio>
using namespace std;
#define int long long
const int MAXN=;
int n,r,t,digit[MAXN],dp[MAXN][MAXN];
//digit是上界各个位置的数
//dp记录搜过的值
int dfs(int pos,int pre,bool limit)
//我这里的记搜和上面讲的略有不同,求的是不满足条件的数,如果出现49了就不继续做
//最后答案就是上界减去搜出来的数值
//这样可以在记搜时去除一维,加快一点速度
{
if(pos==) return ;
if(!limit&&dp[pos][pre]!=)
//这里的!limit是因为如果当前填的数是有范围的(不能大于上界),就不满足一般的规律
{
return dp[pos][pre];
}
int up=;
if(limit) up=degit[pos];
//如果有限制就把上界设为范围的值
int ans=;
for(int i=;i<=up;++i)
if(pre==&&i==)
continue;
//满足条件就跳出
else
{
ans+=dfs(pos-,i,limit&&(i==digit[pos]));
}
if(!limit)
//和上面的!limit同一个道理
{
dp[pos][pre]=ans;
}
return ans;
}
void solve(int x)
{
t=;
int xx=x;
while(x>)
{
++t;
digit[t]=x%;
x=x/;
}
printf("%lld\n",xx-dfs(t,,)+);
}
main()
{
scanf("%lld",&n);
for(int i=;i<=n;++i)
{
scanf("%lld",&r);
solve(r);
}
}

数位dp浅谈(hdu3555)的更多相关文章

  1. 浅谈数位DP

    在了解数位dp之前,先来看一个问题: 例1.求a~b中不包含49的数的个数. 0 < a.b < 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字, ...

  2. 数位dp真·浅谈 By cellur925

    预警:由于是从$Vergil$学长那里和$Mathison$大神那里学来的,所以清一色记忆化搜索!qwq 巨佬的数位dp讲解(未来的咕咕日报头条): https://www.luogu.org/blo ...

  3. 浅谈状态压缩DP

    浅谈状态压缩DP 本篇随笔简单讲解一下信息学奥林匹克竞赛中的状态压缩动态规划相关知识点.在算法竞赛中,状压\(DP\)是非常常见的动规类型.不仅如此,不仅是状压\(DP\),状压还是很多其他题目的处理 ...

  4. hdu3555 数位dp

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Subm ...

  5. hdu3555 Bomb (记忆化搜索 数位DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  6. hdu---(3555)Bomb(数位dp(入门))

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submi ...

  7. hdu3555 Bomb 数位DP入门

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 简单的数位DP入门题目 思路和hdu2089基本一样 直接贴代码了,代码里有详细的注释 代码: ...

  8. 【Hdu3555】 Bomb(数位DP)

    Description 题意就是找0到N有多少个数中含有49. \(1\leq N \leq2^{63}-1\) Solution 数位DP,与hdu3652类似 \(F[i][state]\)表示位 ...

  9. 【hdu3555】Bomb 数位dp

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

随机推荐

  1. LeetCode算法题-Rectangle Overlap(Java实现)

    这是悦乐书的第325次更新,第348篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第195题(顺位题号是836).矩形表示为数组[x1,y1,x2,y2],其中(x1,y ...

  2. 应用安全 - 工具 - 浏览器 - IE浏览器 - 漏洞汇总

    CVE-2014-6332 Date 2014.11 CVE-2016-0189 | MS16-051 Date 2016年初 CVE-2018-8174

  3. js文件编码 的坑

  4. 一些重温CSS需要注意的小细节

    <!-- CSS是用于描述页面展示的语言 字体.颜色.大小.间距,将内容分为多列 或者简单的动画及其他的装饰效果 决定了长啥样 html房子的骨架 css负责装修 怎么装修一个房子呢? 首先就是 ...

  5. babel版本问题

    在运行webpack命令的时候总是报错,原来是因为babel版本的问题 我安装的webpack3  babel版本是6 babel-loader是8 后来把babel改成7就可以了

  6. Spring Boot 2.2.0 正式发布,支持 JDK 13!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 推荐阅读: Spring Boot 2.2.0 正式发布了,可从 repo.spring.io 或是 Maven Centr ...

  7. IDEA导入Junit jar包,在JavaSE的Module中使用Junit测试

    写代码时偶尔想试一下自己的小想法,于是在IDEA中建了一个JavaEE项目.JavaEE项目中只能在main方法中运行代码块,不如单元测试的@Test灵活. 于是在网上找到了Junit的jar包:Do ...

  8. c++ const 用法

    1.  修饰一般变量,const int a = 10;  表示此变量不能被修改,简单易懂,不多说 2.  修饰指针,主要是下面三种 const int *cp1 = &a;       // ...

  9. POJ 3135 Polygons on the Grid(枚举+凸包)

    题目大意是让你用这n条边放在网格上构成凸包,并且边的两端点必须在网格上. 那么比较容易想到的就是枚举可能情况,因为这样的勾股数组成情况不多,因此可以直接枚举所有连出去的边反映在坐标轴上的所有情况,最后 ...

  10. getopt_long函数解析命令行参数

    转载:http://blog.csdn.net/hcx25909/article/details/7388750 每一天你都在使用大量的命令行程序,是不是感觉那些命令行参数用起来比较方便,他们都是使用 ...