简单Dp选讲
最近学了点简单的数位 dp。
虽然常数略大一点,但是记搜是真的好写而且还不怎么动脑子/se
P4999 烦人的数学作业
记录当前第几位,是否到上界。
没了。
P1836 数页码
同上
P6218 [USACO06NOV] Round Numbers S
记录当前是第几位,有几个 $0$ ,是否到上界,有无前导 $0$。
P4317 花神的数论题
记录当前是第几位,有几个 $1$ ,是否到上界。
P3147 [USACO16OPEN]262144 P
模拟赛原题。
似乎有更简单的做法。反正我的做法就是先从小到大枚举一下当前是第几个数,设为 $k$,然后连续且都等于 $k$ 的块合并。如果是偶数,那么这个对左边和右边都有贡献。如果是奇数,作为分割点。每次递归(分治?)的时候记录左边和右边有几个等于 $k$ 的。
然后只有一个块之类的特判一下?
比较抽象,就贴个代码好了。
1 |
|
P4127 [AHOI2009]同类分布
考虑到各位数字之和最大只有 $9\times \log_{10}N=9\times 18$ ,所以枚举各位数字之和,记为 $mod$。
记录当前在第几位,当前数字模 $mod$ 的值,当前各位数字之和,是否到上界。
P4124 [CQOI2016]手机号码
板子。
P3413 SAC#1 - 萌数
如果有回文串,那么必定有长度为 $2$ 或者 $3$ 的回文子串。
这题还需要记录是否有前导 $0$。
P6754 [BalticOI 2013 Day1] Palindrome-Free Numbers
双倍经验。
P3311 [SDOI2014] 数数
先对于集合中的数建 AC自动机。
记录当前第几位,在AC自动机上的状态,是否。如果当前在AC自动机上的状态是某个串的结尾,则直接返回 $0$。
贴个代码.
1 |
|
CF1710C XOR Triangle
对于 $x,y,z$ 上同一位的 $a,b,c$ ,我们发现 $a\bigoplus b+b\bigoplus c \ge a\bigoplus c$,所以只要满足 $a\bigoplus b+b\bigoplus c > a\bigoplus c$ ,即可保证 $x\bigoplus y+y\bigoplus z > x\bigoplus z$ 。
显然这个式子是轮换的,所以说当且仅当满足三个条件的数可以被记录答案。
因为是二进制下的数,所以如果没有记忆化是否达到上界多出来的常数是不可忽略的。就多开三维分别记录一下。
1 |
|
CF55D Beautiful numbers
由 $1$ 到 $9$ 之中任意选取数的 $\text{lcm}$ 只有 $48$ 个,记为 $p$ ,尝试枚举。
记录当前在第几位,当前每位的 $\text{lcm}$ ,当前数模 $p$ 的值,是否达到上界。
复杂度是 $48\times 18 \times 48\times 2520\times T\times 2$ ,还不包括上界带来的常数,所以是不可接受的。
考虑去除枚举。记录当前在第几位,当前每位的 $\text{lcm}$ ,当前数模 $2520$ 的值,是否达到上界。
只要判断模 $2520$ 的值是否能被每位的 $\text{lcm}$ 整除即可。
然后发现如果每次都初始化会 TLE。
多出来的时间复杂度不仅仅在初始化上,更在于每次都需要重新计算。
因为我的写法把最高位设为 $1$ ,因为不同数位数不一样,所以 $1$ 所代表当前第几位也就不一样,不初始化就会 WA。解决这个问题,只需要将 第一位设为个位,然后记忆化搜索的时候从高位到低位即可。
似乎代码还更加简洁了。
1 |
|