随笔分类 - 动态规划dp
摘要:"题目链接" Solution 应该可以用二分拿部分分,时间 $O(n^2logn)$ 。 然后可以考虑 $n^2$ $dp$ ,令 $f_i$ 代表 $i$ 点被激活,然后激活 $i$ 之前所有点所需的半径。 那么很显然 $f[i]=min(max(pos[i] pos[j],f[j]))$ 其中
阅读全文
摘要:【问题描述】 hy 抄题解又被老师抓住了,现在老师把他叫到了办公室。 老师要 hy 和他玩一个游 戏。如果 hy 输了,老师就要把他开除信息组; 游戏分为 k 轮。在游戏开始之前,老师会将 n 个由英文字母组成的字符串放入箱子。 每局开始,字符串为空串,然后两人轮流在末尾追加字符,保证新的字符串为箱
阅读全文
摘要:"题目链接" Solution 比较简单的树形 $dp$ 。 $f[i][j]$ 代表 $i$ 为根的子树 ,$i$ 涂 $j$ 号颜色的方案数。 转移很显然 : $$f[i][1]=\prod(f[t][2]+f[t][3])$$ 其中 $k$ 代表它的子节点。 其他两种颜色以此类推。 但需要注意
阅读全文
摘要:"题目链接" Solution 70分很简单的DP,复杂度 O(NK)。 方程如下: $$f[i][1]=max(f[j][0]+sum[i] sum[j])$$$$f[i][0]=max(f[i 1][1],f[i 1][0])$$ 然后就要考虑优化,很显然可以用单调队列来优化。 维护当前 $i$
阅读全文
摘要:"题目链接" Solution 动态规划. 令 $f_{i,j}$ 表示 $a$ 数组前 $i$ 个和 $b$ 数组前 $j$ 所得的最长的 LCIS . 转移很好想: $a_i!=b_j :~f_{i,j}=f_{i 1,j}$ $a_i==b_j :~f_{i,j}=max(f_{i 1,j},
阅读全文
摘要:"题目链接" Solution 贼有意思的一个题目。 可以发现阻止我们走的更远的就是那些需要反向走的路程。 然后发现当角度越接近 $180^\circ$ ,对我们最终的答案则更优。 所以先是一个背包把可以达到的角度处理一下,然后再直接算就好了。 卡精度。 Code cpp include defin
阅读全文
摘要:"题目链接" Solution 传统的线性 $dp$ . $f[i][0]$,$f[i][1]$ 分别表示最后一次在 $i$ ,然后在 左边或者右边的最小步数. 然后就每次根据上一次左边和右边的状态转移过来. Code cpp include define N 20001 define in(x)
阅读全文
摘要:"题目链接" Solution 状压 $dp$ . $f[i][j][k]$ 代表前 $i$ 列中 , 已经安置 $j$ 块草皮,且最后一位状态为 $k$ . 同时多记录一个每一列中的不能放的位置 $w[i]$. 然后就可以很轻松的转移了... 转移方程看代码. Code cpp include d
阅读全文
摘要:"题目链接" Solution 状压 $dp$ . $f[i][j][k]$ 代表前 $i$ 列中 , 已经安置 $j$ 位国王,且最后一位状态为 $k$ . 然后就可以很轻松的转移了... 记忆化搜索还是不够啊... 只能会正向 $dp$ . Code cpp include define ll
阅读全文
摘要:"题目链接" Solution 矩阵优化 $dp$. 题中给出的式子的意思就是: 求 nk 个物品中选出 mod k 为 r 的个数的物品的方案数. 考虑朴素 $dp$ ,定义状态 $f[i][j]$ 代表前 $i$ 个物品选择 $mod~k$ 为 $j$ 的方案数. 那么转移方程也很简单 : $$
阅读全文
摘要:"题目链接" Solution 完全背包 $dp$ , 同时再加一个数组 $v[i][j]$ 记录当总和为$j$ 时第 $i$ 种物品是否被选. 为保证从小到大和字典序,先将瓶子按大小排序. 然后按部就班转移,要注意讨论字典序问题.转移看代码. Code cpp include define N 3
阅读全文
摘要:"题目链接" Solution 乍一看发现正着 DP,有明显的后效性,所以就反过来做. 但是同时发现很显然减去多的放后面明显更优,所以按 $R$ 从大排序. 然后 $f[i][j]$ 代表前 $i$ 个选了 $j$ 个的最大价值. 转移方程: $$f[i][j]=max(f[i 1][j],f[i
阅读全文
摘要:"题目链接" Solution 斜率优化$DP$. 今天下午才打的第一道题 QwQ... $90$ 分很简单,一个简单的递推. 令 $f[i]$ 为最后一天旅游的花费, $g[i]$ 为最后一天吃饭的花费. 转移很简单: $f_i=min(f_i,g_j+p (i j)^2);$ $g_i=min(
阅读全文
摘要:"题目链接" Solution 似乎就是个很简单的最长不上升子序列输出方案. 但是有一个很艹蛋的条件: 不同方案选择价格必须不同. 且其股票价格不保证不相同. $f[i]$ 代表以第 $i$ 天结尾的不上升子序列的长度. 其实我们可以推出一个条件 : 相同的两个股票价格同时出现,后者的方案里面一定包
阅读全文
摘要:"题目链接" Solution 搜索+DP. 刚好把搜索卡死的数据范围... 然后应该可以很容易想到枚举行的情况,然后分列去DP. 行的情况直接全排列即可,复杂度最高 $O(C_{16}^{8})$. 然后分列进行 DP, $f[i][j]$ 代表以 $i$ 为结尾,选了 $j$ 个的答案. 之后就
阅读全文
摘要:"题目链接" Solution 我只会60分暴力... 正解是 DP. 状态定义 : $f[i][j]$ 代表 $1$ 到 $i$ 比最短路长 $j$ 的方案数. 那么很显然最后答案也就是 $\sum^{i=0}_{k}f[n][i]$. 转移方程 : 对于任一状态 $f[i][j]$ 我们对可以到
阅读全文
摘要:"题目链接" Solution 很巧妙的 DP。 可以看这里的 "题解" 。 比我自己讲要好的多。 Code cpp include using namespace std; int n,p,f[2][5000]; int main() { cin n p; bool t=0; f[t][1]=1;
阅读全文
摘要:"题目链接" Solution 我DP太菜啦... 考虑到一棵二叉树是由根节点以及左儿子和右儿子构成。 所以答案其实就是 左儿子方案数 右儿子方案数 。 状态定义: $f[i][j]$ 代表深度为 $i$ ,节点个数为 $j$ 的二叉树方案数。 转移方程: 对于每一个状态,节点总数已经确定。 那么枚
阅读全文
摘要:"题目链接" Solution 大概是个裸题. 可以考虑到,如果原图是一个有向无环图,那么其最大半联通子图就是最长的一条路. 于是直接 $Tarjan$ 缩完点之后跑拓扑序 DP就好了. 同时由于是拓扑序DP,要去掉所有的重边. Code cpp include define ll long lon
阅读全文
摘要:"题目链接" Solution 1. 非正解 似乎比较蛇啊,先个一个部分分做法,最短路+$DP$. 在求最短路的堆或者队列中存储元素 $dis_{i,j}$ 代表 $i$ 这个节点,走了 $j$ 条边的距离. 然后跑堆优化 $Dijkstra$ 或者 SPFA 即可. 复杂度 $O(N nlog(n
阅读全文

浙公网安备 33010602011771号