图论 - 最短路例题
单源最短路
道路与航线
农夫约翰正在一个新的销售区域对他的牛奶销售方案进行调查。
他想把牛奶送到 T 个城镇,编号为 1∼T。
这些城镇之间通过 R 条道路 (编号为 1 到 R) 和 P 条航线 (编号为 1 到 P) 连接。
每条道路 i 或者航线 i 连接城镇 Ai 到 Bi,花费为 Ci。
对于道路,花费 Ci 为正数;然而航线的花费很神奇,花费 Ci 可能是负数。
道路是双向的,可以从 ...
搜索 - DFS
简介
DFS(Deep First Search)是遍历方式的一种,它可以用来求排列组合方式的这种遍历问题,实现起来一般使用递归。
剪枝
剪枝策略:
优化搜索顺序
应该首先搜索分支较少的节点,使得它可以被剪掉尽可能多的节点。
排除等效冗余
如果不考虑顺序,尽量用组合的方式搜索以减少冗余。
可行性剪枝
最优性剪枝
记忆化搜索(DP)
N皇后
n 皇后问题是指将 n 个皇后放 ...
搜索 - A*
简介
A* 算法用来解决状态数量非常庞大的问题,如前面遇到的八数码这种每一步变换都是不确定的这类问题,它与堆优化版的 Dijkstra 算法长得很像。
流程
用小根堆存储所有节点,排序依据是这个节点到原点的距离 + 到终点的估计距离。
从队列中取出第一个节点,如果这是终点就找到了最短距离。
将当前节点的所有没有遍历过或者能缩短现有路径长度的子节点入队。
重复上述流程。
证明
设估计当前点到终点 ...
数据结构 - 线段树
简介
线段树是用于维护一个区间内具有结合律数据的高效数据结构,单次操作复杂度为 O(logn)O(\log n)O(logn),但常数较大。
将一个区间不断以 mid=⌊l+r2⌋,[l,mid],[mid+1,r]mid=\lfloor \cfrac{l+r}{2}\rfloor,[l,mid],[mid+1,r]mid=⌊2l+r⌋,[l,mid],[mid+1,r] 为区间分为两个子树, ...
搜索 - BFS
简介
BFS(Broad First Search) 是一种逐层遍历的搜索模式,用队列储存待遍历的点(因此不会爆栈),应用于查找最短路径等场景,一般格式如下:
12345q.push(init);while (q.size()) { int t = q.front(); q.pop(); for (xxx) if (xxx) q.push(xxx);}
若是寻找连通 ...
动态规划 - 状态机模型
简介
在 DP 数组中多加一维用来存储状态,进行状态转移的时候也与记录的状态相关。
股票买卖 IV
给定一个长度为 N 的数组,数组中的第 i 个数字表示一个给定股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润,你最多可以完成 k 笔交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。一次买入卖出合为一笔交易。
原题链接。
状态表示 f(i,j,s) ...
中学知识里一些需要用数学解释的边角料
简介
如标题,本文主要记录中学物理中的一些不那么重要但是又确实会用到的边角料知识。有些需要微积分,有些不需要。
测电阻实验的电流表内外接误差分析
设待测电阻为 RRR,电流表电压表内阻为 RA,RVR_A,R_VRA,RV 并且 RA≪R≪RVR_A\ll R\ll R_VRA≪R≪RV,下面分析为什么将 RRR 与 RARV\sqrt{R_AR_V}RARV 比较。
内接法
对于内 ...
动态规划 - 背包例题
机器分配
总公司拥有 M 台 相同 的高效设备,准备分给下属的 N 个分公司。
各分公司若获得这些设备,可以为国家提供一定的盈利。盈利与分配的设备数量有关。
问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值。
分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数 M。
链接:AcWing 1013。
本题考查多重背包问题与求方案数,代码如下:
1234567891011 ...
动态规划 - 背包方案
背包问题求具体方案
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。
第 i 件物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出 字典序最小的方案。这里的字典序是指:所选物品的编号所构成的序列。物品的编号范围是 1…N。
链接:AcWing 12。
当判断当前物品 i 是否取时,判断下列是否成立即可:
j \ge ...
动态规划 - 最长上升子序列
模板
最长上升子序列问题有 DP 和 贪心 两种解法,见前文,这里再写一遍思路。
表示:f[i] 是以第 i 元素结尾的子序列。
存储:这些子序列中的长度最大值。
状态转移方程:f[i] = max(f[i], f[j]+1),其中 j 是 0~i 中能与第 i 元素构成上升子序列的所有元素下标。
123456789101112131415161718192021222324#include ...