当前位置: 首页 > backend >正文

数位 dp

数位dp

特点

问题大多是指“在 [l,r][l,r][l,r] 的区间内,满足……的数字的个数、种类,等等。”

但是显然,出题人想要卡你,rrr 肯定是非常大的,暴力枚举一定超时。

于是就有了数位 dp。

基本思路

数位 dp 说白了就是个数字(RRR​ 进制下),从高位到地位依次填空。

若询问区间为 [l,r][l,r][l,r],那么可以处理出 [0,r][0,r][0,r][0,l−1][0,l-1][0,l1],相减即可。

显然,一一枚举是不可行的,不妨将其分为若干数位(这应该不可能被卡),每个数位讨论。

在代码中表现为:

设数组 aaaaia_iai 表示在 RRR 进制下,数字 xxxiii 位的数字(位从 111 开始)。

注意到,如果前面填入的数字全部与上界 rrr 相同,那么这一位就不可以超过 rrr 的这一位。

那么就可以用一个变量 UpUpUp 表示目前是否与 rrr 完全相同,再进行记忆化搜索即可。

那么有了记忆化搜索(迭代)写法就必然有递推式写法,毕竟记忆化搜索本质上就是 dp。

挑些例题

洛谷 P4999 烦人的数学作业

记忆化搜索显然要有 dp 数组。

fi,jf_{i,j}fi,j 表示在 不顶上界的情况下, 填数到前 iii 位,数字和为 jjj 的方案数,初始值为 −1-11

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=25,Mod=1e9+7;
using ljl = long long;
int T,a[N];
ljl l,r,f[N][9*18+5];
ljl dfs(int st,bool Up,ljl sum)
{if(st<=0)//搜完了return sum;if(!Up&&f[st][sum]!=-1)//搜过了return f[st][sum];int UP=Up?a[st]:9;ljl ans=0;for(int k=0;k<=UP;++k)ans=(ans+dfs(st-1,(Up&&k==UP),sum+k))%Mod;if(!Up)f[st][sum]=ans;return ans;
}
ljl solve(ljl x)
{int lens=0;while(x>0)//搞定每一位。由于是倒着存,所以搜索时也要倒着搜{a[++lens]=x%10;x/=10;}return dfs(lens,1,0);
}
void Main()
{cin>>l>>r;cout<<(solve(r)-solve(l-1)+Mod)%Mod<<'\n';return;
}
int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>T;memset(f,-1,sizeof(f));while(T--)Main();return 0;
}
http://www.xdnf.cn/news/15885.html

相关文章:

  • 「Java案例」利用方法打印乘法表
  • WPF学习笔记(28)Interaction.Triggers的意义与使用方式
  • dify创建OCR工作流
  • NX584NX559美光固态闪存NX561NW993
  • AI(学习笔记第六课) 使用langchain进行AI开发 load documents(csv和文件夹)
  • 开源社区贡献指南:如何通过Three.js插件开发提升企业技术影响力?
  • Windows批量修改文件属性方法
  • swift-关联性/范型
  • 每日算法刷题Day50:7.20:leetcode 栈8道题,用时2h30min
  • 深度学习方法生成抓取位姿与6D姿态估计的完整实现
  • Python应用进阶DAY10--模块化编程概念(模块、包、导入)及常见系统模块总结和第三方模块管理
  • 设计模式笔记(1)简单工厂模式
  • 【图论】图的定义与一些常用术语
  • thinkphp8\guzzlehttp上传文件应用示例
  • Linux基础命令详解:从入门到精通
  • prometheus 黑盒监控和docker检测
  • git操作
  • Node.js:常用工具、GET/POST请求的写法、工具模块
  • ByteBuf 体系的设计与实现
  • `tidyverse` 长表、宽表的处理
  • 【HarmonyOS】ArkUI - 自定义组件和结构重用
  • 处理Electron Builder 创建新进程错误 spawn ENOMEM
  • Spring AI 聊天记忆
  • 28.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--币种服务(二)
  • Spring Boot 配置文件解析
  • SpringBoot集成MyBatis的SQL拦截器实战
  • Java学习第六十部分——JVM
  • [硬件电路-52]:什么是模拟电路与数字电路;它们的共同点、核心差异点(原理、目标、关注点等)以及它们如何相互转化
  • LeetCode 852:山脉数组的峰顶索引解析与实现
  • STM32CubeMX的一些操作步骤的作用