数位DP总结

数位DP基于动态的思想,记录状态以至于不用重复的计算,能够处理大规模的数

其时间复杂度为O(状态数*转移数) //状态数是dp数组的大小,转移数是for循环大小(这个时间我也不是很想得通,某大佬讲的。。)


比较简单的几种题型:

1): 求l~r数字中包含某些数字特征的数量和(如数字子串中是否有13等) HDU 2089 不要62

2):求l~r数字中各个位数相加能够整除某个数的数量和(如123各位置的数相加为6,判断是否能整除2)

3):求l~r数字中能形成回文串的数量和   LightOJ 1205

4):求l~r数字中能被某数整除的数量和   HDU 3652 B-number


不那么简单的几种题型(大佬无视我):

1):在形成回文串的基础上还要求是先非递增再非递减(等凹性质)   2017广东工业大学程序设计竞赛决赛-G题-等凹数字

2):要求数字能够整除每一位的数字   (此题需要离散,而且初始化不能为0。。)   Codeforces 55D - Beautiful numbers

有待更新。。


小细节;  

1:对于初始化数组,首先不需要每组数组都初始化,只需要在一开始初始化就可以了,但是如果只初始化一次呢,在把数据放进DP数组里的时候,应当先判断是否为!p,

不然就有可能导致dp数组存的并不是枚举0~9的所有可能的数据,而导致下一组数调用到了这个数据(实质是错的)。

2:初始化数据,记得初始化为-1!!!,不然就有可能导致算重而增加了时间复杂度了,因为DP数组存的数也有可能是0,如果你初始化为0,即使存了0也会被认为没算。

3:未完待续~

你可能感兴趣的:(数位DP)