首页 > 其他分享 >数位 DP 做题记录

数位 DP 做题记录

时间:2024-02-14 11:34:01浏览次数:28  
标签:题意 记录 pos leq 当前 DP 数位

数位 DP

数位 DP 的常见套路就是记录当前到哪一位,是否抵着上界,转移时枚举当前可以填哪些数,做一遍记忆化搜索。

P3413 SAC#1 - 萌数

题意:求 \([l,r]\) 中有多少个数中含有回文子串。

思路:如果存在回文子串,那么必然有相邻两位相同或者间隔一位相同,在数位 DP 时额外记录前 2 位就可以了。

CF1487F Ones

题意:给定一个正整数 \(n\),要求用只由 \(1\) 组成的数字的和或差表示 \(n\),且使用 \(1\) 个数最少。

思路:一看就像数位 DP,但是又跟普通数位 DP 不太像。

其实直接从高位到低位考虑,那么对当前位进行的操作有影响的只有之前位还剩下的需要抵消的和当前位已经要减多少,即设 \(f[pos][c][x][0/1]\) 表示当前考虑到了第 \(pos\) 位,前面的还有 \(c\) 需要抵消,这一位及一下需要减 \(x\),当前位是 - 还是 + 的答案,于是有转移

\[f[pos][c][x][0/1]=\min(f[pos][c][x+1/-1][0/1]+l-pos,f[pos+1][c*10+a[pos+1]-x][x][1],f[pos+1][c*10+a[pos+1]-x][x][0]) \]

现在的问题是确定 \(c,x\) 的范围,因为在当前位加的 1 个数不会超过 5 次,因此 \(c\leqslant\frac{x}{10}+1\)。

P9129 [USACO23FEB] Piling Papers G

题意:给定长度为 \(n(1\leq n\leq 300)\) 的整数序列 \(a(1\leq a_i\leq 9)\),和整数区间 \([A,B](1\leq A\leq B\leq 10^{18})\),有 \(q\) 次询问,每次询问给出 \(l,r\)。每次询问开始,你有一个空串 \(x\),你可以正序对 \(a_{l\sim r}\) 进行操作,操作有三种:\(x\rightarrow\overline{x+a_i}\),\(x\rightarrow\overline{a_i+x}\),或者什么也不做,求 \(\overline{x}\) 的取值在 \([A,B]\) 的不同的操作方案数,对 \(10^9+7\) 取模。

思路:很新奇的数位 DP。

因为可以从前、后都加数字,这样传统的数位 DP 显然行不通了。我们发现 \(A,B\) 很小,于是我们可以把当前已经填了的数所在的区间 \([l,r]\) 计入状态。于是设 \(f[i][l][r][0/1/2]\) 表示前 \(i\) 个数形成了区间 \([l,r]\),当前数和 \(t\) 的关系(\(>,<,=\))。最终答案是 \(f[n][1][len][0/1]+\sum\limits_{l>1}f[n][l][len][0/1/2]\)。

这样求出来的是每个前缀的答案,于是预处理出所有后缀的答案就可以 \(O(1)\) 回答了。

P2518 [HAOI2010] 计数

题意:现在给定一个数,你可以删掉这个数中的任意多个数位 0
(或不删)并将其他的数位任意重新排序。请求出能产生出多少个不同的这个数小的数(注意这个数不会有前导 0)。

思路:看起来是数位 DP,不过可以有更优的做法,数据范围可以加 1000000 个 0!

那就是可重复元素的康托展开。

从末尾往前,维护当前答案和当前排列个数,排列个数就是 \(\dfrac{n!}{\prod a_i}\),记当前是 \(a\),已经出现了 \(b\) 次,比 \(a\) 小的有 \(c\) 个,于是当前位的贡献就是 \(\dfrac{tc}{b}\)。

于是用树状数组维护即可。

CF585F Digits of Number Pi

题意:给定数字串 \(s,x,y(len(x)=len(y),x\leqslant y)\),求存在长度不小于 \(\left\lfloor\dfrac{len(x)}{2}\right\rfloor\) 的子串是 \(s\) 的子串的数字串 \(t\in[x,y]\) 的数量。

思路:首先看到 \([x,y]\) 第一反应肯定是数位 DP,但又因为与字符串匹配有关,自然就考虑上 AC 自动机或 SAM,而我写的是 SAM 的做法。设 \(f[cur][pos][len][lim][flag]\) 表示当前在第 \(cur\) 位,在 SAM 上为第 \(pos\) 个节点,当前已匹配的字符串长度为 \(len\),\(lim=0/1\) 表示有没有顶到上界,\(flag=0/1\) 表示目前长度合不合法。转移时枚举下一个选的哪一个数字,若长度已合法或 SAM 上当前节点有这个儿子则可直接转移,否则不断跳 \(link\) 直到有这个儿子或跳到了 1 号节点为止,然后再转移。复杂度 \(O(10nd^2)\)。

CF55D Beautiful numbers

题意:Volodya 认为一个数字 \(x\) 是美丽的,当且仅当 \(x\in\mathbb{Z^+}\) 并且对于 \(x\) 的每一个非零位上的数 \(y\),都有 \(y|x\)。

你需要帮助他算出在区间 \([l,r]\) 中有多少个数是美丽的。

思路:首先想到,\(1\sim 9\) 的 \(lcm\) 是 2520,于是我们可以在数位 DP 时记录当前模 2520 的于是和当前的 lcm,而有用的 lcm 只有 48 个,可以只记录这些,于是就做完了。

P3303 [SDOI2013] 淘金

题意:记 \(f(i)\) 表示 \(i\) 的数码的乘积,一开始所有 \((i,j)(i,j\in[1,n])\) 上有一个金子,然后所有位置上的金子会移动到 \((f(i),f(j))\),你可以选择 \(k\) 个位置,求最多可以有多少金子。

思路:首先考虑枚举 \(f(i)\) 计算有多少 \(i\)。因为 \(f(i)\) 的指质因子只有 2,3,5,7,可以把每个质因子的指数存进状态进行数位 DP 计算答案。

然后就是贪心了。将 \(f(i)\) 按照对应多少个 \(i\) 从大到小排序然后贪心选择即可。

标签:题意,记录,pos,leq,当前,DP,数位
From: https://www.cnblogs.com/Xttttr/p/18015099

相关文章

  • 势能相关做题记录
    势能相关P5905【模板】全源最短路(Johnson)题意:有负权情况下的全源最短路。思路:Johnson全源最短路可以在\(O(nm\logm)\)的复杂度内解决带有负权的全源最短路。这个算法的巧妙之处在于为每个点赋予势能\(h_i\)。从一个点到另一个点,无论走什么路径,势能的变化量都是一定的。......
  • 数学题做题记录
    数学主要是计数和数论函数相关。[AGC031F]WalkonGraph题意:有一张\(n\)个点\(m\)条边的无向连通图\(G\),每条边有长度\(L_i\),有一个人在上面游走。有\(q\)组询问,每组询问给出\(s_i,t_i,r_i\),询问是否存在一条从\(s_i\)出发到\(t_i\)结束且长度为\(r_i\)的路径......
  • Codeforces Round 113 (Div. 2)E. Tetrahedron(dp、递推)
    目录题面链接题意题解代码总结题面链接E.Tetrahedron题意从一个顶点出发走过路径长度为n回到出发点的方案总数题解考虑dp\(f[i][0|1|2|3]\):走了i步,现在在j点的方案总数转移:\(f[i][0]=f[i-1][1]+f[i-1][2]+f[i-1][3]\)\(f[i][1]=f[i-1][0]+f[i-1][2]+f[i-1][3]\)\(f......
  • manjaro 开机黑屏问题记录
    环境信息系统:manjaro-kde6.6.12-1-MANJARO显卡:RadeonRX5802048SP问题描述偶现开机黑屏,无法进入登录界面,无法进入tty检查/var/log/Xorg.0.log日志,可以发现以下异常信息:AMDGPU(0):getvblankcounterfailed:Invalidargument很有可能是AMD图形驱动模块AMDGPU......
  • Vue3杂碎知识记录
    vue引入bootstrap当卸载App.vue里不行的时候就还可以写在main.js里导入bootstrap的时候写在main.js里,(还要添加依赖@popperjs/core)import'bootstrap/dist/css/bootstrap.css';import'bootstrap/dist/js/bootstrap';//注意js文件也要引入进来写在vue的script里面不行,要......
  • sublimetext 使用中遇到的问题记录
    sublimetext使用关键词:应该是编码过程中出现了系统问题,所以导致无法正常运行,才会显示“unregistered”(未登记、未注册)。sublimetext本身是不支持中文编码的,所以要解决“unregistered”的问题,需要通过安装插件来解决。具体步骤是:打开这个文件,并确认它的编码是UTF-8。然后选择......
  • php调用sql server过程记录
    更新微软源,需要安装微软的底层库curlhttps://packages.microsoft.com/config/rhel/7/prod.repo>/etc/yum.repos.d/mssqlrelease.repo安装依赖底层库yuminstall-ymsodbcsqlmssql-toolsunixODBC-devel根据php版本选择对应的pdo_sqlsrv扩展版本,查询地址为http://pecl.ph......
  • 小米手机 adb shell 用户 组 相关命令和输出记录
    cas:/$iduid=2000(shell)gid=2000(shell)groups=2000(shell),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats),3009(readproc),3011(uhid)context=u:r:shell:s0cas:/$groupsinputlog......
  • [Kyana]Fedora使用记录
    删除旧内核:dnfremove--oldinstallonly重置密码密钥环不匹配:安装seahorse新建并默认,可以单独设置密码,记好优化和扩展:dnfinstallgnome-tweaksgnome-extensions-app推荐扩展:user-themeseye-and-mouse-extendedjust-perfectionnothing-to-saytransparent-window-moving......
  • Atcoder Educational DP Contest 题解
    比赛链接:Atcoderr或者题单A:Frog1常规线性dp,注意到对于每个落点来说,青蛙只能由第\(i-1\)个石头或者第\(i-2\)个石头转移得到,那么我们让\(dp[i]\)为当跳到第\(i\)个石头上的最小费用。此时显然有:\[dp_i=\min(dp_{i-1}+\left|h_i-h_{i-1}\right|,dp_{i-2}+\left|h_......