随笔分类 -  动态规划

摘要:令 $f[i][k][j]$ 表示考虑前 $i$ 个位置,有 $k$ 次更新,且最大值为 $j$ 的方案数. 转移的话是一个前缀和. 由于是多组询问,所以可以先预处理出来. 细节什么的要注意一下. code: #include <bits/stdc++.h> #define ll long long 阅读全文
posted @ 2020-06-02 09:42 EM-LGH 阅读(205) 评论(0) 推荐(0)
摘要:我们发现最多只会用 n 个背包. 令 $f[S]$ 表示装完 $S$ 的物品所需最少背包数量. 令 $g[S]$ 表示满足 $f[S]$ 的情况下剩余的最大重量. 转移略复杂,细节比较多. code: #include <bits/stdc++.h> #define N 24 #define inf 阅读全文
posted @ 2020-06-02 09:11 EM-LGH 阅读(123) 评论(0) 推荐(0)
摘要:思路十分显然,但是结构体的写法要注意. 定义重载运算符可以有效地减小代码量. 因为一个小错误调了半天,自闭了. code: #include <map> #include <cstdio> #define mod 998244353 #define setIO(s) freopen(s".in"," 阅读全文
posted @ 2020-06-01 22:01 EM-LGH 阅读(200) 评论(0) 推荐(0)
摘要:自己想+切掉的,开心. 推一推就发现如果要权值最大,就尽量使用那个乘法. 然后就分两种情况讨论一下: 1. 乘法用到 k-1 次. 2. 乘法用不到 k-1 次. code: #include <bits/stdc++.h> #define ll long long #define N 3006 # 阅读全文
posted @ 2020-05-29 17:15 EM-LGH 阅读(163) 评论(0) 推荐(0)
摘要:$O(n^2)$ 的式子是好列的,然后我们发现这是一个关于前后缀的转移. 用线段树合并优化这一过程. 具体地,分别维护 $x,y$ 的后缀和. 这里要注意:由于这道题中两个不同子树肯定没有交集,所以在线段树合并的时候肯定会合并到一个点,使得两个树中一个为空. 然后由于另一个是空的,就没有合并的必要了 阅读全文
posted @ 2020-05-29 13:59 EM-LGH 阅读(224) 评论(0) 推荐(0)
摘要:思路比较自然. 开始的时候有一个地方糊涂了,后来想清楚就好了. 这里注意一个地方: 令 $f[S]$ 表示 $S$ 集合的所有排列中 sum(S) 为最大值的排列数. 然后转移 $f[S]$ 的时候要把新的元素放到序列开头,因为放到结尾的话前面的前缀可能非常小,导致到达不了结尾. code: #in 阅读全文
posted @ 2020-05-27 16:37 EM-LGH 阅读(173) 评论(0) 推荐(0)
摘要:这道题比的就是谁更细心. 令 $f[i]$ 表示前 $i$ 面玻璃的透过率(从 $1$ 射入) 令 $g[i]$ 表示前 $i$ 面玻璃的反射率(从 $i$ 射入) 然后进行递推就行. code: #include <bits/stdc++.h> #define ll long long #defi 阅读全文
posted @ 2020-05-27 08:48 EM-LGH 阅读(136) 评论(0) 推荐(0)
摘要:神仙 DP. 可以求解 $1$ 号点的答案 $val(1)=w$. 假设所选的 $S$ 集合包含 $w$,那么答案一定为 $1$. 令叶子节点个数为 $m$,则有 $2^{m-1}$ 个集合的答案为 $1$. 假设当前修改代价为 $i$,想让根节点的答案改变. 最优改变方式有两种:1.将小于 $w$ 阅读全文
posted @ 2020-04-29 08:16 EM-LGH 阅读(219) 评论(0) 推荐(0)
摘要:比较友好的背包+期望题. 刚开始没特判概率为 0 的情况,WA 了半天. 总是还是挺简单的吧,只要会期望的线性性就行. code: #include <bits/stdc++.h> #define N 207 #define M 203 #define mod 998244353 #define l 阅读全文
posted @ 2020-04-07 13:15 EM-LGH 阅读(186) 评论(0) 推荐(0)
摘要:由于有重复数字,所以这个问题就很不好处理. 考虑我们让 $i$ 为根,这个点对答案的贡献就是以 $i$ 为根,由 $val[i] \leqslant val[j]$ 的 $K$ 个点组成的连通块个数. 但是我们会发现如果直接求的话会算重一部分. 如果 $val[j]>val[i]$ 的话,将这个点设 阅读全文
posted @ 2020-04-04 18:26 EM-LGH 阅读(194) 评论(0) 推荐(0)
摘要:这算是决策单调性入门题吧. 我们很容易发现 $f[i]$ 的转移 $p_{i}$ 满足单调性,然后拿单调队列来维护就行. 对于队列中每个元素维护这个元素转移区间的右端点 新加入一个点的时候和队尾比较一下,看队尾是否会被覆盖,弹掉无用元素. code: #include <bits/stdc++.h> 阅读全文
posted @ 2020-04-02 23:06 EM-LGH 阅读(200) 评论(0) 推荐(0)
摘要:嘴巴上把这道题切了,但是写代码的时候好多细节都需要注意. 1. 大概可以猜到能表示出的数字比多,但是这一步要用 BFS+hash 才行,因为用 DP 求解的话会有好多无用状态. 2. 做动态规划的时候如果对与状态有限制条件的话比较好写的方法是由合法状态去转移下一步,而不是枚举当前状态去找上一步的状态 阅读全文
posted @ 2020-04-02 09:45 EM-LGH 阅读(188) 评论(0) 推荐(0)
摘要:新学了一下决策单调性. 对于这道题,我们可以先考虑 $j<i$ 的情况. 然后我们发现随着 $i$ 变大,$i$ 的决策点不可能减小(因为根号函数的增长速率越来越小,所以一旦被赶超上是不可能追回来的) 然后有两种处理方式:单调队列+二分 or 整体二分. 前者细节较多,后者更好写一些. code: 阅读全文
posted @ 2020-03-30 11:15 EM-LGH 阅读(242) 评论(0) 推荐(0)
摘要:对于树边直接转移,然后按照套路拆环,在环上做一个单调队列 DP. 一种方案虽然在一个换上可能算不了,但是一定可以在另一个环上计算到. 仙人掌上 DP 的套路就是遇到树边就按照树上做,遇到环就拆环,做一个环形 DP. code: #include <bits/stdc++.h> #define N 2 阅读全文
posted @ 2020-03-29 23:40 EM-LGH 阅读(139) 评论(0) 推荐(0)
摘要:对于树的情况是简单的. 我们 DFS 这颗仙人掌,对于树边正常转移就行. 然后对于环,我们把环拿出来,然后强制讨论端点选/不选再跑一遍 DP 就行. code: #include <bits/stdc++.h> #define N 200006 #define setIO(s) freopen(s" 阅读全文
posted @ 2020-03-29 11:56 EM-LGH 阅读(166) 评论(0) 推荐(0)
摘要:开始的时候没有借助圆方树去思考,思路非常混乱,想了很长时间后冷静下来发现这题不就是分类讨论简单题嘛... 题目不难,分两种情况讨论: 设当前点为中间点(圆点) 起点从一个儿子的子树进入到中间点后进入到另一个儿子的子树. 起点从一个儿子的子树进入到中间点后仍然回到该儿子子树中(相当于上一条的子问题) 阅读全文
posted @ 2020-03-29 01:07 EM-LGH 阅读(177) 评论(0) 推荐(0)
摘要:题意:有 $n$ 种牌,每种牌有 $C$ 张. 有两种方法能组成一叠: - $(i,i+1,i+2)$ - $(i,i,i)$ 一副牌是合法的,当且仅当这副牌能被分成若干叠. 给出牌的种类数 $n$ 以及每种的张数 $C$,和每种牌必选的个数.(如果该牌必选 $k$ 张,则有 $C-k$ 张是可选可 阅读全文
posted @ 2020-03-14 15:55 EM-LGH 阅读(216) 评论(0) 推荐(0)
摘要:这个题求完斯坦纳树后再搞一个类似于子集 DP 就行了. 我写的好像有点麻烦,但本质是相同的. code: #include <bits/stdc++.h> #define N 3006 #define M 13 #define inf 0x3f3f3f3f #define ll long long 阅读全文
posted @ 2020-03-12 20:28 EM-LGH 阅读(153) 评论(0) 推荐(0)
摘要:这道题和网络收费那道题的套路是一样的. 都是直接枚举每一个点的状态. 但是要注意:这里枚举每个点的状态是基于 dfs 的,所以有递归式:$f(T)=4\times f(\frac{T}{2})$ (算两次) 那么就有 $f(ROOT)=4^n$. 这个是仅考虑 dfs 部分的复杂度,要是把背包部分算 阅读全文
posted @ 2020-03-12 00:35 EM-LGH 阅读(152) 评论(0) 推荐(0)
摘要:神仙题!!!! 其实还是有一点没有搞懂,但是大体上差不多懂了. code: #include <bits/stdc++.h> #define ll long long #define N 3200020 #define setIO(s) freopen(s".in","r",stdin) using 阅读全文
posted @ 2020-03-11 23:42 EM-LGH 阅读(178) 评论(0) 推荐(0)