洛谷P2602 数字计数 [ZJOI2010] 数位dp

正解:数位dp

解题报告:

传送门!

打算在寒假把学长发过题解的题目都做辣然后把不会的知识点都落实辣! ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄

然后这道题,开始想到的时候其实想到的是大模拟,就有点像之前考试贪心专题里的这题一样

但是仔细一看发现大模拟做得可能太复杂辣,,,讨论有点儿多,但是肯定是讨论得出来的辣想想看省选的时候大力讨论一波就有100pts岂不美哉!

但是反正今天是不会港模拟的解法dei,,,这里港的是数位dp的方法

首先很容易想到的是,数位dp套路来说,它既然是要求[l,r],那就显然是[1,r]-[1,l-1]呐是趴

然后就考虑,设f[i][j]:有i位时第j个数字有几个

首先像个最基础的,不管前导0的影响

显然的是在不管前导0的影响的情况下所有数字的f[i]都是相等的,也就是说能直接删去一维j,变为f[i]:有i位时每个数字有几个.

那转移也很好想鸭,就是f[i]=f[i-1]*10+10i-1.

转移挺好理解的我就随便解释下

首先不管在前面加什么数都有f[i-1]的贡献,前面加的数可以是[0,9]有10种,所以是f[i-1]*10

但还要考虑的是前面加的是j(我知道j这一维已经删了,,但是不好表示,就强行让它出场下QAQ),那就是最高位已经定了,后面还有i-1位可以随便填数,就是10i-1(后面的贡献已经在f[i-1]*10中计入辣)

(话说我jio得这个就是个小学奥数,,,我居然罗里吧嗦解释了这——么多,,,看来确实越来越菜了鸭呜呜呜

(*这里很重要吼,后面的完善其实都是用的这里的思想,刚好一个用了f[i-1]*10的解释一个用了10i-1的解释

然后进一步完善,依然不管前导0,但是考虑到有上限,怎么搞?

那就从高位往低位计算

举个eg趴,ABCD

从高往低想,先是A000,那不考虑最高位,每个数字出现次数就是A*f[i],然后最高位能出现小于等于A的数字,每个数字都能出现103次,然后A000就处理完辣(其实和我之前推的那个转移式的原理是一样的嘛

然后对于B00,C0和D,都是一样的套路鸭,然后就又变成递推式辣484!

最后只要考虑一下前导0怎么除掉呐

认真想一下,前导0的情况显然是前面一串连续的0嘛,然后就一位一位地算呐,其实仔细思考一下,依然是我第一步推的那个式子中的关于10i-1的解释,你想下吼,一样是规定了最高位,一样是后面随便走,那不就是一样的求法嘛,于是假如要求的右边界有n位,这n位都可以是0嘛,于是就是10n-1+10n-2+10n-3+...+100

做完辣!完结撒fafa!

(最后说一句吼,,,这题和我说的考试里那题挺像的,所以既然这题能用数位dp显然那题也行,还记得sol里出题人港他开始想的解法就是数位dp嘛

所以极大可能我等下会写下那题的数位dp解法!

如果没写就是咕了就当没看到上面这句话趴QAQ

猜你喜欢

转载自www.cnblogs.com/lqsukida/p/10354325.html