数位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:未完待续~