摘要:Description 有$N$个左下定点为原点的矩阵, 每个矩阵$(x_i,~y_i)$都有一个数$a_i$表示其花费。 没有一个矩阵包含另一个矩阵。 现要你选出若干个矩阵, 使得矩阵组成的图形的大小减去总花费得到的数最大 Solution 先按照$x_i$ 递增排序, 由于矩阵互不包含, 所以$
阅读全文
摘要:Solution 设状态 $F[i][j] $为 还剩余 $i$ 个人时, 第 $j$ 个人 的胜率。 边界: $F[1][1] = 1$(只剩下一个人了)。 这样设置状态就能使 $i-1$ 个人的答案 转移到 $i$ 个人的答案上。 最后输出 $F[N][i]$ 。 状态转移: Code 1 #i
阅读全文
摘要:Description 找出$[L, R]$ 区间内有多少数, 各位数字和 能整除原数 Solution 枚举每个可能的数字和, 进行数位DP即可 , 水爆 Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #de
阅读全文
摘要:Solution 发现 $x \ xor \ 2x = 3x$ 仅当 $x$ 的二进制中没有相邻的 $1$ 对于第一个问题就可以进行数位DP 了。 但是对于第二个问题, 我们只能通过递推 打表 来算出答案了。 推公式 打表 可知, 这是一个斐波那契数列, $a_0 = 1, a_1 = 2, a_2
阅读全文
摘要:Solution 我的解法好像很不优美。。。 定义了$4$维数组$f[i][j][pre][k]$ 表示第$i$位, 有$j$个1, 当前位的数字为$pre$,是否比输入大$k$。。。然后进行$DP$即可 看到隔壁的$2$维很惭愧 Code 1 #include<cstdio> 2 #include
阅读全文
摘要:Description 在$[L, R]$找出有几个数满足两个条件 : 1 : 不同时含有$4$ 和 $8$ 2 : 至少有$3$个相邻的数相同 Solution 非常容易的数位DP, $pos$ 为当前第几位, $ex$ 表示是否出现过$4$ 或 $8$, $pre$表示 前面的是几, $num$
阅读全文
摘要:传送门 Solution 这道数位$DP$看的我很懵逼啊。。。 首先我们肯定要先预处理出 $12$位乘起来的所有的可能情况, 记录入数组 $b$, 发现个数并不多, 仅$1e4$不到。 然后我们考虑算出有多少的$x$ 使得$f(x) = y$, 并记录个数到$ans[y]$ 中。 然后? 然后我就不
阅读全文
摘要:Solution 数位DP板子套上就好了 讲解传送门 Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define rd read() 5 #define ll long long 6 using namesp
阅读全文
摘要:Description 求$[L, R]$内, 有多少个数能被自己所有位上的数整除 Solution 妥妥的数位DP, 但是就是不会做2333, 状态很难想到。 显然不可能把最后的数作为一个状态。 我们想到一个数如果整除所有位上的数, 肯定整除他们的最小公倍数, 所以把所有位上的数的最小公倍数作为一
阅读全文
摘要:Solution 这题真秒啊,我眼瞎没有看到这是个排列 很显然, 有一条性质: 第一个是山峰 和 第一个是山谷的情况是一一对应的, 只需要把每个数 $x$ 变成 $n-x+1$ 然后窝萌定义数组 $f[ i ][ j ]$ 表示有 $i$ 座山, 且第一座山是山谷(即开头上升) 且 高度 $<= j
阅读全文
摘要:Solution 比较好想的dp, 但是坑不少QAQ, 调半天 由于容忍度 $b_i$<= 7, 所以可以考虑将第$i$个人接下来的$b_i$ 个人作为一个维度记录状态。 于是我们定义数组$f[ i ][ S ]$ 表示前$i-1$个人都已经拿到了菜, S表示$i$和接下来$b_i$个人是否拿到了菜
阅读全文
摘要:Solution 首先要找到使得最后一个数最小, 只需定义一个数组$pre[i]$ 从区间$[pre[i], i]$表示的数, 是最小的能使前面的数递增的方案。 $[ pre[n], n]$即为最小的最后一个数。 接着我们依据这找出的最后一个数, 向前dp, 找出使得每个数都最大的方案。 前导0是非
阅读全文
摘要:Solution 用对角线的前缀和快速进行转移,复杂度$O(N^3)$, 洛谷神机太快了$N^3$都能过 然而正解是单调队列优化, 能优化到$O(N^2)$,然而我弱得什么都不会 Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algor
阅读全文
摘要:Solution 啊。。。 我太菜了唔 不看题解是不可能的, 这辈子都不可能的。 首先一个队伍中排队轮到某个人的时间是递增的, 又要加上吃饭时间, 所以只能使吃饭时间递减, 才能满足最优,于是以吃饭时间为关键字排序 然后定义数组 $f[i][j]$ 为前$i$个,第一个队伍要排$j$分钟时, 前$i
阅读全文
摘要:Description 给一个01矩阵, 求出最大的01交错的正方形和最大的01交错的矩阵 Solution 用动态规划求出最大的正方形, 用单调栈求出最大的矩阵。 在这里仅介绍求出最大正方形(求最大矩阵 = 单调栈裸题 传送门 : 不会单调栈的同学可以去学 定义数组$f[ i ][ j ]$ 为以
阅读全文
摘要:Description 树形背包, 遍历到一个节点, 枚举它的每个子节点要选择多少个用户进行转移。 Code 1 #include<cstring> 2 #include<cstdio> 3 #include<algorithm> 4 #define rd read() 5 #define R re
阅读全文
摘要:Description 在 $n * m$ 的格子上放若干个炮, 使得每个炮都不能攻击到其他炮 Solution 定义数组f[ i ][ j ][ k ] 表示到了第 i 行, 已经有2个炮的列数为 j, 有1个炮的列数 为k, 的方案数有多少。 然后就能非常简单的写个dp了 Code 1 #inc
阅读全文
摘要:题解 怎么看都不像是个背包,直到我看了题解→_→, 第一次碰到这么奇怪的背包= = 定一个滚动数组$F_i$, $i$表示机器$a$用了$i$的时间, $F_i$表示机器$b$用了$F_i$的时间, 然后就直接可以进行滚动转移了。。。 真是开眼界啊QuQ 代码 1 #include<cstring>
阅读全文
摘要:题解 得出状态转移方程为 : $F_i = \min(F_j + (i - j - 1 + S_i - S_j - L)^2 $ 如果我们想要对它进行斜率优化, 必须将平方拆开,很显然是非常不容易的(我这个蒟蒻拆了一下午还是错了唔 所以必须想办法将它变得简单,让 $S_i = S_i + i$, $
阅读全文
摘要:题解 非常显然的$O(n^2)$ 的dp转移方程 : $ F_i = \max( F_j + a \times (S_i - S_j) ^2 + b \times (S_i - S_j ) + c) $ 数组S为前缀和 进行一波分离后变成了 $ F_j + a \times (S_j)^2 - b
阅读全文