题意:求区间[l,r]内有多少个数符合,这个数的任意的相邻k位数(digits),这k个数都两两不相等

l,r范围是1~1e18,k是2~5

思路:数位DP,因为K<=5,我们最多需要保存下来当前位的前4位就足够了。因为dp[pos][p1][p2][p3][p4]表示,现在枚举取第pos位,pos位之前的四位分别为p1,p2,p3,p4,p4是pos的上一位。那么p1~p4的范围就是0~9,但是因为总位数小于当前数字的位数的数也要进行枚举,需要一个数字来区分它是前导0还是在中间时为0,令p = 10是前导0,或者表示不需要储存,即最高位的前几位。那么dfs函数可以写成 dfs( int pos , int p1 , int p2 , int p3 , int p4 , bool flag ) flag表示pos位能否取到全部的数位(0~9)还是会受到前面最高位的影响只能取一部分。

对于记忆化搜索首先明确代码的dfs的定义为当前四位分别为p1,p2,p3,p4时枚举第pos位总共有多少种方法,则dp方程很容易便能想到是1、pos位之前都取的0,即p4==10,而pos位也取0,一直都是前导零。2、而当p4!=10,pos位取的i去和p判断一下有没有重复(根据k来判断需要比较几个p),所以也是可以向下统计的,然后记得记忆化就好。

而dp的定义为当前四位数为p1,p2,p3,p4是枚举pos位总共有多少种方法,这与dfs是不同的,因为对于dp 不需要考虑必须在小于当前数的范围内进行枚举,而dfs代表的方法数必须在小于当前数的范围之内,这就可以解释第38行。同时因为大多数情况下都是flag为假,随意选择记忆这种情况可以降低复杂度(这是我猜的,如果大家有别的想法可以说出来交流一下)

#include #include#include#include#include#include#include

using namespacestd;

typedeflong longll;const int N = 50000+10;const int mod=1e9+7;const double en=2.718281828459;

ll l,r,dp[20][11][11][11][11];int k,dig[20];bool cek(int u,int p1,int p2,int p3,intp4){if(k==2)return u!=p4;if(k==3)return u!=p4&&u!=p3;if(k==4)return u!=p4&&u!=p3&&u!=p2;if(k==5)return u!=p4&&u!=p3&&u!=p2&&u!=p1;

}

ll dfs(int pos,int p1,int p2,int p3,int p4,intflag){if(pos==0)return p4!=10;if(!flag&&dp[pos][p1][p2][p3][p4]!=-1) returndp[pos][p1][p2][p3][p4];//记忆化int ed=flag?dig[pos]:9;//当前面的数取小于其位置上的数显然后面的数可以取0~9

ll ans=0;for(int i=0;i<=ed;i++){if(i==0&&p4==10)

ans+=dfs(pos-1,10,10,10,10,flag&&i==ed);else if(cek(i,p1,p2,p3,p4))

ans+=dfs(pos-1,p2,p3,p4,i,flag&&i==ed);

}if(!flag) dp[pos][p1][p2][p3][p4]=ans;returnans;

}

ll cal(ll u){int cnt=0;while(u>0){

dig[++cnt]=u%10;

u/=10;

}return dfs(cnt,10,10,10,10,1);

}intmain()

{//freopen("in.txt", "r", stdin);

while(~scanf("%lld %lld %d",&l,&r,&k)){

memset(dp,-1,sizeof(dp));

printf("%lld\n",cal(r)-cal(l-1));

}return 0;

}

数位dp 记忆化搜索java_hdu 5787 数位dp,记忆化搜索相关推荐

  1. 拨云搜索:帮你查找记忆中的小说

    小伙伴们注意:公众号的推送机制不再按照时间前后推送了,微信公众号信息流乱序.君哥建议大家把公众号置顶(设为星标★),以便第一时间看到推送,方法如下图:   万水千山总是情,为君哥三连行不行 谢谢大家了 ...

  2. 搜索的剪枝——让爆搜变成“搜索”

    剪枝,是搜索的自带神技.不管是BFS还是DFS,在搜索的过程中都难免会计算重复或不需要的东西,我们就可以直接将它剪掉,不计算它,这个过程就被形象地称为剪枝. 总目录 原则 分类 可行性剪枝 最优性剪枝 ...

  3. 区块链的去中心化VS传统互联网的去中心化:技术与治理的双重困境

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 区块链的去中心化VS传统互联网的去中心化:技术与治理的双重困境11 主要观点: 1.传统互联网经典的去中心化项目BitT ...

  4. 正在搜索需要的文件一直在搜索_正在被蚕食的百度搜索

    28.03.2019 本文字数:3118,阅读时长大约6分钟 导读:百度搜索在国内一家独大的格局虽暂时无人撼动,但愈发饱和的流量市场背后,搜索业务正呈现出多元化与差异化发展的趋势. 作者 | 第一财经 ...

  5. 加一度解析百度搜索困局,小程序将开启搜索流量新机遇

    近期,不知大家在使用百度APP时,有没有发现其搜索结果内智能小程序的出现增多了? 这实际上是百度针对智能小程序开发者在搜索流量上开放的一个重要动作,这也意味着在百度的搜索场景中,智能小程序可以获得更多 ...

  6. linux在vim中搜索文件,技术|超酷的 Vim 搜索技巧

    尽管目前我们已经涉及 Vim 的多种特性,但此编辑器的特性集如此庞大,不管我们学习多少,似乎仍然远远不足.承接我们的 Vim 教程系列,本文我们将讨论 Vim 提供的多种搜索技术. 不过在此之前,请注 ...

  7. 利用记忆规律促进学生有效学习(记忆规律在教学中的运用)

    利用记忆规律促进学生有效学习(记忆规律在教学中的运用) 学习方法问答 一.利用记忆规律促进学生有效学习?(记忆规律在教学中的运用) 明确记忆目的,增强学习的主动性 理解学习材料的意义 对材料进行精细加 ...

  8. 基于MaxCompute+开放搜索的电商、零售行业搜索开发实践

    简介:搜索一直是电商行业流量来源的核心入口之一,如何搭建电商行业搜索并提升搜索效果,一直是电商行业开发者努力攻克的难题.基于传统数据库或开源引擎虽然能够搭建基础搜索服务,但随着商品数据的增多和业务流量 ...

  9. 阿里云开放搜索实践,使用阿里云开放搜索来做网站站内搜索...

    阿里云的开放搜索已经做得很完善了,现在阿里云集成了开放搜索,只要定义好表结构,上传数据,就会自动生成索引,马上就可以搜索了,简直可以做个搜索引擎了.一起来看看. 阿里云开放搜索介绍及购买页 首先,创建 ...

最新文章

  1. PortableApps的使用方法
  2. K近邻算法KNN的简述
  3. Linux学习--目录结构
  4. 【日记】一次程序调优发现的同步IO写的问题,切记
  5. htpdate代替ntpdate同步时间
  6. qmake, makefile, make是什么东东,makefile简介!
  7. 四.jmeter代码学习, SampleResult【持续更新】
  8. Tensorflow——[Could not load dynamic library cudart64_101.dll]解决方案
  9. js中的showModalDialog的实战应用
  10. LeetCode2——Add Two Numbers(两个链表中的数字相加,形成新链表)
  11. 数学建模学习笔记(十二)——奇异值分解
  12. JS, CSS 文件压缩与反压缩工具
  13. 运维管理成中小企业“心头大患” 飞塔“安接入”一步解决
  14. 日访问量1万mysql_日访问量1万服务器
  15. java即时通讯源码 IM即时通讯源码 IM源码 安卓苹果原生APP源码 带音视频无标题】
  16. qa 芯片测试_关于半导体设备测试,看这一篇就够了
  17. 尺度不变特征变换(SIFT)匹配算法详解
  18. 向量叉积和点积混合运算_向量点积叉积及其几何意义
  19. php+Sphinx分词中间件的认识和基础使用(亲测)
  20. Freeswitch 常用命令

热门文章

  1. linux网络编程常用函数详解与实例(socket--bind--listen--accept)
  2. 转,帅气的表格隔行换色+鼠标经过变色、点击变色
  3. java camel dsl,Apache Camel与Spring DSL
  4. mysql打包备份数据到_thinkPHP使用pclzip打包备份mysql数据库的方法
  5. MIT_18.03_微分方程_Fourier_Series_傅里叶级数_Notes
  6. git提交后的代码在哪儿_别乱提交代码了,来围观下大厂的 Git 提交规范
  7. verilog基础篇RAM IP核的使用
  8. 标记化结构初始化语法(C语言)
  9. 1月30日嵌入式精英座谈齐聚北航
  10. 【任务脚本】0522更新京东618叠蛋糕任务脚本,京东任务自动程序