数位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. suitecrm配置(nginx设置)

    suitecrm配置在nginx下的一些设置 server { listen 88; server_name 192.168.2.253; #charset koi8-r; #access_log / ...

  2. CentOS 6.X Python 2.6升级到Python 2.7 【转】

    前言:一些第三方框架为了降低复杂性,新的版本已经开始不支持旧版本的python,比如Django这个web框架1.8版本及以上仅仅只支持python2.7及以上版本(记忆中是这个1.8版本),pip安 ...

  3. P1067多项式输出

    这道题是2009普及组的题,仍然是一个字符串+模拟.(蒻到先不刷算法) 这道题的题干给了很多的提示,也很全面,但是当我把种种情况都考虑到了后,在写代码的过程中仍然出现了很多的错误,wa了三四次.其实导 ...

  4. [BZOJ 4332] [JSOI2012]分零食(DP+FFT)

    [BZOJ 4332] [JSOI2012]分零食(DP+FFT) 题面 同学们依次排成了一列,其中有A位小朋友,有三个共同的欢乐系数O,S和U.如果有一位小朋友得到了x个糖果,那么她的欢乐程度就是\ ...

  5. C++ cin相关函数总结

    输入原理: 程序的输入都建有一个缓冲区,即输入缓冲区.一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据.正因为cin函数是直接从缓冲区取数据 ...

  6. 01:django基础篇

    Django其他篇 目录: 1.1 django初探 1.2 第一个django项目 1.3 django render/redirect/HttpResponse 和 request.GET req ...

  7. git学习指南

    近来学习Git,苦寻资料下发现廖雪峰老师的教程很好,在此推荐传送门 附每节总结,方便查阅 创建版本库 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 使用命令git ...

  8. HNUSTOJ-1258 Time

    1258: Time 时间限制: 1 Sec  内存限制: 128 MB提交: 16  解决: 11[提交][状态][讨论版] 题目描述 Digital clock use 4 digits to e ...

  9. Python中函数传递参数有四种形式

    Python中函数传递参数有四种形式 fun1(a,b,c) fun2(a=1,b=2,c=3) fun3(*args) fun4(**kargs) 四种中最常见是前两种,基本上一般点的教程都会涉及, ...

  10. OC+swift混编

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...