数位dp 模板

板子

?? 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其实就是一种算法策略可以让我们
记忆化地去搜索我们想要得到的数据结果

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值