数位dp小结


前言:

本文参考了洛谷日报

数位$dp$就是套模板——某大佬

套模板是真的可以,每道题目都差不多,但是重在理解,才能变通,先来看一道题

洛谷P1831 杠杆数

这道题就是典型的数位$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$就讲到这,主要还是要理解并且多做题吧,个人认为

原文地址:https://www.cnblogs.com/yexinqwq/p/10231844.html