数位dp一般用于处理一些和数位有关的计数问题,比如说求区间[l,r]中有多少符合条件的数,而为了减少时间复杂度,方法使用的是动态规划的思想。

举例说明:问从0到2345这些数中总共包含多少6。

数位dp的思路是:

1.由于千位是2,首先求出[0,2000)中满足条件的个数,因为此时个十百位可以任意取值,不受上界的限制。

2.之后由于千位已经到达最高,要改为考虑百位,此时百位受到上界的限制,所以之后需要求出[2000,2300)中马满足条件的个数,此时十位和个位不受限制。

3.当百位是3时,十位又受到限制…以此类推。

当然,如何计算一个整百整千的区间的满足条件的个数,也需要在代码中体现,比如这里f(2000)=2f(1000)=2(100+10f(100))=2(100+10(10+10f(10)))

以下是数位dp的模板:


#include<stdio.h>
#include<algorithm>
#include<iostream>
#define n 20
using namespace std;
typedef long long ll;
ll dp[n][state];//state作为状态,不同的题目可能有不同的状态个数,有时甚至需要改变dp的维数,第一维代表数的长度
ll dd[n];//将数的每一位存储到数组
ll dfs(int pos,int state,bool lead,bool limit)
/*pos表示当前的数位,此处pos=0表示个位,pos=1表示十位,以此类推
state表示状态参数,也可以有多个状态参数
lead表示前导零(一般来说只有当答案和0有关系时才需要这个参数)
limit表示当前pos位是否受限)*/
{if(pos==-1)//表示已经搜索结束return 1;//返回并不确定,结合实际情况改变if(!lead&&!limit&&dp[pos][state]!=-1)//在不受限的情况下如果dp已被更新,则直接返回return dp[pos][state];int now=limit?dd[pos]:9;//now用以确定搜索终点,不受限就是9,受限就是当前pos位的数值ll ans=0;for(int i=0;i<=now;i++)//注意边界{ans+=dfs(pos-1,newstate,newlead,limit&&i==now);//只有前面所有位数都受限,下一位才受限}if(!limit&&!lead)//只有当不受限时(即范围为整十,整百...),才更新dp数组,因为受限区间不能代表整区间dp[pos][state]=ans;return ans;
}

例题:

hdu2089

所有含有4或者含有62的数都是不吉利的,求一定范围内有多少吉利的数。

ac代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
typedef long long ll;
ll dp[7][10];
ll dd[7];
ll dfs(int pos,int pre,bool limit)//这里前导零不影响结果,不需要lead   pre表示pos位前一位的数字
{if(pos==-1)return 1;//进行到这里说明之前位已经全部通过,返回1if(!limit&&dp[pos][pre]!=-1)return dp[pos][pre];int now=limit?dd[pos]:9;ll ans=0;for(int i=0;i<=now;i++){if(i==4||i==2&&pre==6)continue;//是不吉利的数就跳过ans+=dfs(pos-1,i,limit&&(i==dd[pos]));}if(!limit)dp[pos][pre]=ans;return ans;
}
ll build(int n)//计算从1-n的个数
{int k=0;while(n){dd[k++]=n%10;n/=10;}return dfs(k-1,0,true);
}
int main()
{memset(dp,-1,sizeof(dp));//初始化int a,b;while(scanf("%d%d",&a,&b),a+b){printf("%ld\n",build(b)-build(a-1));}return 0;
}

算法学习之路|数位dp简要分析相关推荐

  1. 算法学习之路和程序员(技术)学习必读书籍

    原文链接:http://lucida.me/blog/on-learning-algorithms/ 转 算法学习之路和程序员(技术)学习必读书籍 2015年05月26日 09:46:56 阅读数:1 ...

  2. 完全背包问题贪心算法c语言,数据结构与算法学习之路:背包问题的贪心算法和动态规划算法...

    一.背包问题描述: 有N种物品和一个重量为M的背包,第i种物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包重量,且价值总和最大. 二.解决方法: 1.贪心算 ...

  3. 巩朋:我的算法学习之路

    转自:http://blog.jobbole.com/67348/ 巩朋:我的算法学习之路 分享到: 232 MVC架构模式分析与设计 Linux Guide for Developers 网页广告特 ...

  4. 拿下斯坦福和剑桥双offer,00后的算法学习之路

    董文馨,00后,精通英语,西班牙语.斯坦福大学计算机系和剑桥大学双Offer,秋季将进入斯坦福大学学习. 10岁开始在国外上学:12岁学Scratch: 13岁学HTML & CSS: 14岁 ...

  5. 数位DP学习整理(数位DP看完这篇你就会了)

    文章目录 数位DP 数位DP介绍 数位DP解法 数位DP经典例题 例题1:度的数量 例题2:计数问题 例题3:数字游戏 例题4:windy数 例题5:数字游戏Ⅱ 例题6:不要62 例题7:恨7不成妻 ...

  6. 【算法小讲堂】数位dp(简单入门)

    数位打牌 爷爷,你没有关注的博主又更新博客啦!! 数位dp(打牌),这是一个相当深刻并且具有意义的话题.在没看懂这个内容的时候完完全全就是一脸懵逼,现在依旧是一脸懵逼.你以为你会了,题目:不,你不会! ...

  7. 1.1.10 从二分查找BinarySearch开启算法学习之路---《java算法第四版》

    文章目录 0.前言 1.功能 2.示例 有两个名单tinyW.txt和tinyT.txt,将tinyT.txt名单中不在tinyW.txt的数据打印出来 ① 实现原理 ② 实现代码 ③ 性能分析 0. ...

  8. 算法学习之路|最小生成树——prime算法

    摘要: 算法概述:对于一个带权的连通图,其顶点的集合 为V,边的集合为E.定义一个新的集合Vnew={空},第一步在图中任选一个顶点v加入Vnew,第二步寻找最短的边(u,v),其中u∈Vnew,v∈ ...

  9. 算法学习之路|最小生成树—kruskal

    算法概述:一个带权的连通图, 有V个点,E个边,去掉所有的边,得到一个新图,将E个边按权值从小到大排列,然后从权值最小的边<u,v>开始加入,重复下去,但每次加入之前要判断u,v是否连通, ...

最新文章

  1. Python中正则表达式用法 重点格式以这个为准_首看_各种问题
  2. hive 的udf 函数使用
  3. python安装numpy库用清华镜像_Mac下基于Anaconda通过清华镜像安装Tensorflow
  4. 委婉的拒绝offer
  5. python 粒子动画_python-盒子中有很多粒子-物理模拟
  6. 【Java】输入三角形的三边长,求三角形的面积
  7. html5 Canvas 标签介绍
  8. 窄带物联网(NB-IoT)技术开发云平台的系统构架图是什么?
  9. 程序员如何用编程套路追到女朋友的?
  10. Deskreen 将 Web 浏览器变为第二屏幕
  11. java webrtc视频会议_JAVA webRtc的实现视频会议系统
  12. 620集成显卡和mx250_英伟达mx250和英特尔uhd620显卡那个好?
  13. mac web服务器 修改默认,mac如何修改默认播放器-mac修改默认播放器的方法 - 河东软件园...
  14. 阿里80亿贷款细节曝光 并购背后图谋大数据
  15. 【博客排版】中文文案排版指北(转载)
  16. WindowsPE无法安装系统
  17. egg extend ts_NAS初体验—威联通TS-451D - jingkunliu
  18. 【HR必看】Excel中对身份证号码的处理技巧
  19. 求求你了,不要再浪费抗原了!!!
  20. raspberry pi_如何制作Raspberry Pi游戏手柄

热门文章

  1. dom4j ---最好的xml解决方案?
  2. 2021年最后几天,使用SSM实现网上购物商城系统
  3. Pandas对不同类型缺失值的转换规则
  4. Oracle+jsp+Servlet的员工表的简单增删改查
  5. Luogu5369 [PKUSC2018]最大前缀和
  6. idea怎么配置spring
  7. [杂谈]杂谈章2 eclipse没有(添加)“Dynamic Web Project”
  8. some learning
  9. redis sentinel哨兵模式集群搭建教程
  10. Spring Boot 之构建Hello Word项目