随笔分类 -  动态规划

优化的暴力~
摘要:算法要素:二叉树的中序&前序遍历+区间dp 思路分析: 二叉树中序遍历的顺序是:左->根->右 因此对于原题目给出的区间$(1,n)\(,其根节点一定在\)(1,n)$上。 同时,二叉树具有合并的性质,即不断合并子节点可以得到最终的根节点, 而区间dp也是通过不断地合并区间得到最终的答案$dp[1] 阅读全文
posted @ 2021-11-04 23:08 Mint-hexagram 阅读(205) 评论(0) 推荐(0)
摘要:算法要素:奇怪的区间dp+高精度int128暴打高精 思路分析: 很容易想到每行之间根本没有任何关系。 因此问题转化为了:在长度为m的区间中从区间两端取数$a[i]$,第k次得分为$a[i]\times x$。 要求使每行最终总得分最大。最终答案为所有行的最大得分之和。 具体实现: (1)这题的一大 阅读全文
posted @ 2021-11-03 15:16 Mint-hexagram 阅读(93) 评论(0) 推荐(0)
摘要:算法要素:暴力dp+超长题面的阅读理解 思路分析: 先找出几个细节: (1)每一个时刻都必须有机器人位于环上。 (2)对于每个时刻 $i$ ,在 \(i\) 制造的机器人一定会花 \(1\) 的单位时间收集位于第 \(i\) 条边上的金币。 (3)每次可以从任意位置开始重新选择机器人。 然后可以选择 阅读全文
posted @ 2021-11-03 11:12 Mint-hexagram 阅读(178) 评论(0) 推荐(0)
摘要:奇怪的题,真的很怪,调了1h 传送门:洛谷P4095 [HEOI2013]Eden 的新背包问题 算法要素:二进制拆分+正反两次01背包(特殊01背包) 最开始没什么思路,发现可以直接多重背包,水掉50分。 打上一个二进制拆分,数据梯度太大,因此意义不大。 考虑离线,O(1)回答询问,结果还掉到40 阅读全文
posted @ 2021-10-26 11:44 Mint-hexagram 阅读(86) 评论(0) 推荐(0)
摘要:#全篇重点(奇怪的bug): ####tarjan缩点+topo排序求最长链的常见问题: (1)建新图的时候没有用缩点后生成的新点,而是用原来的点建图 (2)建新图的时候注意不要建重复的边,最好用并查集维护两个新点是否被连接过 ✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧ 阅读全文
posted @ 2021-09-16 16:48 Mint-hexagram 阅读(44) 评论(0) 推荐(0)
摘要:#状压dp 将状态表示为一个或多个n进制数,通过数位的运算判断情况之间是否合法,从而完成状态的转移。 ###矩阵内状压dp一般模板 伪代码 将每一行的状态用一个二进制数表示 a{i}.s存储第i中合法情况的二进制数 f{i}{j}表示第i行状态为第j种状态时的答案(最大值or方案数) for(int 阅读全文
posted @ 2021-09-08 17:52 Mint-hexagram 阅读(47) 评论(0) 推荐(0)
摘要:洛谷题面传送门 ###题目分析: 题面给出每一步可以走2^k步,k为任意正整数。这很明显是倍增。 而简单的最短路无法解决这个问题,因此考虑图上倍增dp。 设f[i][j][q](bool)表示是否存在一条从i到j长度为2^q的路径。 g[i][j]存储从i到j的最小步数和 考虑初始化, 对于每一个输 阅读全文
posted @ 2021-09-08 08:14 Mint-hexagram 阅读(65) 评论(0) 推荐(0)
摘要:第一次写缩点是用vector存边,因此现在用链前存边再写一遍 传送门:P3387 【模板】缩点 题意分析 (1)很容易发现,由于每一个点可以被经过多次,那么同一个强连通分量中的每一个点都可以互相到达,因此可以看作一个点。 (2)缩点后,整张图一定变成了一个DAG 证明:反证即可,假设不是DAG,则有 阅读全文
posted @ 2021-09-04 14:11 Mint-hexagram 阅读(52) 评论(0) 推荐(0)
摘要:一、基本概念&算法基础: 顾名思义,就是把一些状态压缩成一个或多个n进制数来表示,然后通过数位的运算来判断这些数所对应的状态是否合法,从而成对状态的转移。 常用2进制,因此2进制位运算就很重要。 二、没了 注意合法性常常需要从多个方面考虑,不要漏掉需要考虑的情况。 例题:洛谷P1879 [USACO 阅读全文
posted @ 2021-08-24 16:43 Mint-hexagram 阅读(39) 评论(0) 推荐(0)
摘要:二进制优化用于多重背包中。 (1)多重背包模板: long long dp[maxn], n, W, v[maxn], w[maxn], m[maxn]; //n是物品种类,W是背包总容量,v[i]是第i种物品的价值,w[i]是第i种物品的重量,m[i]是第i种物品的件数 for(int i = 1 阅读全文
posted @ 2021-07-19 15:46 Mint-hexagram 阅读(97) 评论(0) 推荐(0)