这一周一直在学dp,先学了一些简单的dp,然后又学了状压dp,这次又学了数位dp,唉,感觉这dp是真的难,可能是我太菜了吧,没办法,慢慢学吧,本来准备一周把dp学完是不太可能了,因为今天已经周六了,还是进入正题,说我们的数位dp吧。
数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满足一些条件数的个数。所谓数位dp,字面意思就是在数位上进行dp咯。数位还算是比较好听的名字,数位的含义:一个数有个位、十位、百位、千位......数的每一位就是数位啦!之所以要引入数位的概念完全就是为了dp。数位dp的实质就是换一种暴力枚举的方式,使得新的枚举方式满足dp的性质,然后记忆化就可以了。
这是抄的别人的解释,下面说一下我自己对数位dp的额理解吧,状态dp你运算的时候,是以每个数字所代表的二进制的每一位来为运算对象的,而数位dp呢,它是以数字的每一个数字为运算对象的,一个数字的个位,十位,百位……
解题思路:用数位dp的题一般都是让你求一个区间中,满足一些特征的数字的个数,例入求一个区间的奇数的个数……这样的题一般的数据的范围都比较大,就是让你用正常的暴力是根本写不出来的,就算写出来了那么也一定会超时,这样我们就需要一中特殊的方法进行暴力,那就是数位dp了,数位dp也是一种暴力,只不过他相当于一种记忆化的暴力,就是说它的暴力比较省时间,就像提前打好了表一样,这样一般都不壶超时了,
首先我们每次都可以先构造一个关于dp的二维数组dp[i][j]。代表的意思是一个数字的长度为i,以j数字开头的时候,所有符合特征的数字。