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

  • 相关阅读:
    核心动画的使用
    核心动画的使用
    核心动画的使用
    异常上报功能Bugly简介
    核心动画的使用
    一种传统的程序模块化马甲包开发架构
    定时器、多线程
    核心动画
    Core Animation 核心动画
    核心动画的使用
  • 原文地址:https://www.cnblogs.com/yexinqwq/p/10231844.html
Copyright © 2020-2023  润新知