07 2024 档案
摘要:思路不难想,细节比较多。 思路 观察到 ,首先想到状压 dp 。 于是自然地定义 为:抵达点的状态为 ,且此时在点 时,简单路径的条数。注意这里是简单路径的条数,而不是环的个数,因为环的个数要在 dp 过程中统计。这里的 d
阅读全文
摘要:拓扑排序好题。
阅读全文
摘要:绝世树形 dp 好题。一般看到有关树上“路径”的题,就要把路径拆成一个个独立的单边,对每个单边独立计算贡献。同时还有易错的树形背包上下界优化,用链构造卡掉。
阅读全文
摘要:状态设计 基本上每一种 dp 都有一种标准的 dp 定义方式,树形 dp 也是如此: 定义 表示以 为根节点的子树里最优的决策。 从分析子树入手,转移便是找到某一子树中,根节点与各子树、边权间的递推关系。 最优解常常是关于根节点的函数。 它的子结构是一颗子树。 实现方式
阅读全文
摘要:二分答案有一个很显著的特征:一定存在一个临界值,单调性只是临界值的一种,而不是全部。 临界值,就是寻找第一个/最后一个满足要求的值,这又分别对应着两个完全不同的二分模板,这里做题时推荐使用“第一个满足要求的值”,即对应着 STL 中的 upper_bound ,手写板对应着 这篇文章 里讲的模板。
阅读全文
摘要:依据值域的 做法 这种做法只适用于这种值域小的题,下一种做法才是求等差数列的通解。 我们定义 表示以 为最后一个数,公差为 的等差数列(长度 ) 的个数。 接下来我们找每一个数前面的数,确定公差后转移即可。
阅读全文
摘要:题目:绝世好题。 暴力 dp 显然 转移即可。 单调队列优化 观察到只有某二进制位两个数都为 时才能转移,因此我们把每个二进制位开一个单调队列,然后对于一个数 ,找到它是 的二进制位并选其单调队列的队头进行转移,在这之后把这个数加入符合要求的
阅读全文
摘要:朴素算法 不必多说, 的暴力 dp 转移。 优化算法 时间为 ,本质是贪心,不是 dp 。 思路是维护一个单调栈(手写版),使这个栈单调不降。 当该元素 栈顶元素时,把这个元素压入栈中。 否则,在单调栈中找到第一个大于该元素的项,把
阅读全文
摘要:很好的构造+01BFS的图论建模题,运用了把有后效性 dp 转化为最短路问题的 trick 。
阅读全文
摘要:概述 大致分为以下几类: 01背包 完全背包 多重背包 混合背包 二维背包 分组背包 依赖背包(树形背包) 以及一个变式:跳楼梯模型,本质是转移顺序的改变。 背包题基本上没有套路,只能靠多练题,总结思路,最重要的还是把问题抽象成背包模型的能力。 01 背包 特点:无序加入,每个物品加一次。 完全背包
阅读全文
摘要:旋转坐标轴的 trick 和二维差分的综合运用。
阅读全文
摘要:连通块/链表/BFS 的多解题
阅读全文