前言:
本文参考了洛谷日报
数位$dp$就是套模板——某大佬
套模板是真的可以,每道题目都差不多,但是重在理解,才能变通,先来看一道题
这道题就是典型的数位$dp$,模板就是这样子。。
考虑记忆化搜索
那么来讲讲记搜中的参量一般有哪些:
$lead$:前导零标记(后文阐述)
$limit$:最高位标记(后文阐述)
$pos$:当前在第几位
某些题目可能还需要加更多的参量,视题目而定
$lead$标记
由于我们直接从最高位搜起,那么就要考虑前导零这个问题
举个例子,我们要找$[0,9999]$中的相邻两数相同的数的个数
那么$111$,$222$,$333$肯定是可以的,但是我们搜索的起点是$0000$,那么搜索到$111$的时候我们数组是$0111$,而程序就会判断这种情况不合理,于是我们就要处理前导零
前导零的转移:
如果当前的$lead$为$1$,并且当前这位也是$0$,那么这位肯定是前导零,那么转移就$pos-1$,$lead=1$
如果当前的$lead$为$1$,并且当前这位不是$0$,那么从这位开始之后就不是前导零了,那么转移就$pos-1$,$lead=0$
某些题目是不需要前导零标记的,例如上面的链接例题,所以灵活利用吧
$limit$标记:
假如我们要搜索$567$,那么有以下两种情况要考虑(假设现在在最高位百位):
假设我们这位取的值为$1$~$4$,那么转移的时候,十位的取值范围就是$0$~$9$
而假如我们这位取的值是$5$,那么转移的时候,十位的取值范围就是$0$~$6$
所以我们要有最高位标记,最高位标记转移如下:
如果$limit=1$,并且这位取的值是能取的最大值,那么$pos-1$,$limit=1$
如果$limit=1$,但是这位取的值不是最大值,那么$pos-1$,$limit=0$
如果$limit=0$,那么无论如何$pos-1$,$limit=0$
所以总结一下,转移就是$limit&&i==maxn$($i$为当前取的值,$maxn$为能取的最大值)
注意事项:
有的时候函数返回的值并不是正确的,有可能会重复搜索$0$这个状态,所以最后还要考虑特殊情况,例如链接的例题
结语:
那么数位$dp$就讲到这,主要还是要理解并且多做题吧,个人认为