数位dp浅谈(hdu3555)
数位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)的更多相关文章
- 浅谈数位DP
在了解数位dp之前,先来看一个问题: 例1.求a~b中不包含49的数的个数. 0 < a.b < 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字, ...
- 数位dp真·浅谈 By cellur925
预警:由于是从$Vergil$学长那里和$Mathison$大神那里学来的,所以清一色记忆化搜索!qwq 巨佬的数位dp讲解(未来的咕咕日报头条): https://www.luogu.org/blo ...
- 浅谈状态压缩DP
浅谈状态压缩DP 本篇随笔简单讲解一下信息学奥林匹克竞赛中的状态压缩动态规划相关知识点.在算法竞赛中,状压\(DP\)是非常常见的动规类型.不仅如此,不仅是状压\(DP\),状压还是很多其他题目的处理 ...
- hdu3555 数位dp
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Subm ...
- hdu3555 Bomb (记忆化搜索 数位DP)
http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Memory ...
- hdu---(3555)Bomb(数位dp(入门))
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submi ...
- hdu3555 Bomb 数位DP入门
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 简单的数位DP入门题目 思路和hdu2089基本一样 直接贴代码了,代码里有详细的注释 代码: ...
- 【Hdu3555】 Bomb(数位DP)
Description 题意就是找0到N有多少个数中含有49. \(1\leq N \leq2^{63}-1\) Solution 数位DP,与hdu3652类似 \(F[i][state]\)表示位 ...
- 【hdu3555】Bomb 数位dp
题目描述 求 1~N 内包含数位串 “49” 的数的个数. 输入 The first line of input consists of an integer T (1 <= T <= 1 ...
随机推荐
- Scratch少儿编程系列:(六)诗词《从军行》赏析
一.程序说明 本程序用来显示<从军行>诗词,逐字显示.本来计划用2.0制作,但在制作过程中,在“造型”中无法输入汉字,临时采用3.0版本,1.4版本也可以. 二.程序流程图 为了更直观的描 ...
- git关联github远程仓库的问题
git关联github远程仓库的时候,报fatal: remote origin already exists. 导致这个问题原因可能是之前关联的时候关联错了,再次关联就不行了. 解决办法是: 1.将 ...
- Hive-java.lang.ClassNotFoundException: org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe
Task with the most failures(): ----- Task ID: task_1555476136794_8201_m_000000 URL: http://hadoop1:8 ...
- [转帖]IIS7.5应用程序池集成模式和经典模式的区别介绍
IIS7.5应用程序池集成模式和经典模式的区别介绍 之前转帖过一个 但是感觉不如这个说的细: https://www.jb51.net/article/31010.htm 关注脚本之家微信公众号(jb ...
- 关于golang select的用法
1 go的信道 1.1 什么是信道 信道可以理解为go协程之间进行通信的通道. 1.2 信道的声明 所有的信道都关联一个类型,一旦关联了类型,该信道就只能传输该类型的数据,传输其它类型的数据的话就是非 ...
- Linux yum 命令篇
yum( Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器. 基於RPM包管理,能够从指定的服务器自动下载RPM包 ...
- [CF585E]Marbles
Description: 给定一个序列 \(a_i\) ,每次可以交换相邻两个元素,求使序列变成若干个极大连续段,每个极大连续段内部的值相同且任意两个极大连续段的值互不相同. \(n\le 4\tim ...
- Python作图包含type3字体解决方案
1. 解决方案 matplotlib.rcParams[‘text.usetex’] = True
- web 过滤器 Filter、 Spring 拦截器 interceptor
1.过滤器(Filter)(在web.xml中注册过滤器) 首先说一下Filter的使用地方,我们在配置web.xml时,总会配置下面一段设置字符编码,不然会导致乱码问题: <filter> ...
- django中的FBV和CBV??
django中请求处理方式有2种:FBV 和 CBV 一.FBV FBV(function base views) 就是在视图里使用函数处理请求. 看代码: urls.py from django.c ...