初探数位dp.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
初探数位dp.ppt

基本知识 动规 [l,r] 意为 l=且=r的数 [l,r) 意为 l=且 r的数 (l,r] 意为 l 且=r的数 (l,r) 意为 l 且 r的数 其实方括号意味着取等,小括号意味着不取等 基本思想与方法 有了上述性质,我们就可以从高到低枚举第一次n对应位是哪一位。 这样之前的位确定了,之后的位就不受n的限制即从00...0~99...9,可以先预处理,然后这时就可以直接统计答案。 Hdu2089 题目链接:/showproblem.php?pid=2089 题目大意:给定区间[n,m],求在n到m中没有“62“或“4“的数的个数。 如62315包含62,88914包含4,这两个数都是不合法的。 0n=m1000000 Hdu2089 参照刚刚所说的基本思路。预处理f数组,然后统计[0,m] - [0,n)。 f[i,j]代表开头是j的i位数中不含62或4的数有几个。 如f[2,6]包含60,61,63,65,66,67,68,69 f[0,0] = 1; for i = 1 ~ 7 for j = 0 ~ 9 //枚举第i位 for k = 0 ~ 9 //枚举第i - 1位 if j 4 and not(j = 6 and k = 2) f[i,j] = f[i - 1,k] + f[i,j]; Hdu2089 如f[2,6]的转移 6? ? = 0,1,2,3,4,5,6,7,8,9 f[2,6] = sum(f[1,j]) j = ? Hdu2089 统计区间[0,n] 从高到低枚举哪一位比n小 如n = 4 5 6 Hdu2089 统计区间[0,n] 从高到低枚举哪一位比n小 如n = 4 5 6 Hdu2089 伪代码: //digit[i] 代表 n 从右到左第i位是多少,len是n有几位。 //如 n = 58 digit[1] = 8 digit[2] = 5 for i = len ~ 1 //枚举哪一位n的对应位 for j = 0 ~ digit[i] - 1 //枚举这一位的取值 if j 4 and not (j = 2 and digit[i + 1] = 6) ans = ans + f[i,j]; //情况合法 if digit[i] = 4 or (digit[i] = 2 and digit[i + 1] = 6) break; //已经出现4或62 Hdu3652 题目链接:/showproblem.php?pid=3652 题目大意:求小于n是13的倍数且含有13的数的个数。 Hdu3652 同样参照前面的思想,先预处理,再统计。 题目需要包含13,且被13整除,我们就设计状态f[i,j,k,l]代表 i位数中第一位是j的, 是否有包含13(k == 1 or 0), 模13余数是l的数有几个。 Hdu3652 决策第i位: for x = 0 ~ 9 if k = 1 //要求要包含13 f[i,j,k,l] = f[i - 1,x,1,(l - j*10^(i-1))%13]; if j = 1 and x = 3 //已经有13了。 f[i,j,k,l] = f[i,j,k,l] + f[i - 1,x,0,(l - j*10^(i-1))%13]; else //不要求包含13 if not (j = 1 and x = 3) f[i,j,k,l] = f[i - 1,x,0,(l - j*10^(i-1))%13]; Hdu3652 统计小于n的合法的数有几个与上一题类似,只需要记录当前位之前的余数是多少,和是否已经出现了13 bit[0] = 1; for (ll i = 1; i = 12; ++i) bit[i] = bit[i - 1]*10; for (ll i = digit[0],mod = 0; i; --i) { for (ll j = 0; j digit[i]; ++j) { ans += f[i][j][1][(13 - mod*bit[i]%13)%13]; if (t || (j == 3 digit[i + 1] == 1)) ans += f[i][j][0][(13 - mod*bit[i]%13)%13]; } if (digit[i + 1] == 1 digit[i] == 3) t = 1; mod = (mod*10 + digit[

文档评论(0)

aiwendang + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档