数位dp 模板

来源:互联网 发布:新概念英语 软件 编辑:程序博客网 时间:2024/06/15 18:10

板子

?? DP(pos,状态变量...,限制布尔){        if(pos==0)return 1;//一般每次执行到这里时的数是要算入总结果的 不一定是1 根据题目确定        if(!limit&&dp[对应状态]!=-1)return dp[对应状态]; //记忆化搜索        int up = limit?d[pos]:9;//表示如果前面一位有限制 就说明这是擦着区间上界走的 需要返回d[pos] 如果没有限制 说明没临界 返回9        ll a=0;        for(int i=0;i<=up;i++){            if()...            else if()...//针对不同的题目设置不同的变量记录函数            a+=(pos,状态变量...,限制布尔&&i==d[pos]);//如果这两个条件都有再传递        }        if(!limit)dp[状态]=a;//已经求出对应状态值下的结果了 记录下来        return a;    }

所以 数位dp其实就是一种求解有关于l到r有多少个符合条件的数目类似的统计问题的解题思路
一遍遍数字枚举太慢

不如我们根据条件枚举数位
数位dp本质上是记忆化搜索

我们需要在数位上进行递推
把条件筛选融入到数位上的筛选
所以数位dp其实就是一种算法策略可以让我们
记忆化地去搜索我们想要得到的数据结果

我们把这个数位给他拆开一位一位的枚举
根据题目对应的约束条件 设置记录结构
一般把对应长度,其余位数符合什么什么条件的 并且没有限制的数目记录下来
以供我们之后搜到相同的状态重复利用数据
降低搜索分支