P2758「编辑距离」
1. 题目
题目链接:P2758「编辑距离」 。
题目描述
设 AAA 和 BBB 是两个字符串。我们要用最少的字符操作次数,将字符串 AAA 转换为字符串 BBB。这里所说的字符操作共有三种:
删除一个字符;
插入一个字符;
将一个字符改为另一个字符;
!皆为小写字母!
输入格式
第一行为字符串 AAA;第二行为字符串 BBB;字符串 AAA 和 BBB 的长度均小于 200020002000。
输出格式
只有一个正整数,为最少字符操作次数。
输入输出样例
输入 #1
12sfdqxbwgfdgw
输出 #1
14
2. 题解
分析
易知编辑距离是对称的,即将字符串 AAA 变成字符串 BBB 和将字符串 BBB 变成字符串 AAA 所需的最小操作数是一样的,也就是字符串 AAA、BBB 之间的编辑距离。然后直觉感觉就是一道简单的 dp 题:
假设 f[i][j]f[i][j]f[i][j] 表示字符串 A[0..i−1]A[0..i-1]A[0..i−1] 和 B[0..j−1]B[0..j-1]B[0..j−1] 之间的编辑距离,则有如下转移方程:
如果 ...
Configure脚本学习
1. 指定安装目录
1./configure --prefix=...
CMake 使用学习
1. 概述
CMake 工具能够自动生成 Makefile 文件,减轻手写 Makefile 文件的工作量,同时减少书写 Makefile 文件产生的错误。
2. CMake 命令
CMake 运行主要分为两个阶段:
配置阶段:解析 CMakeLists.txt 文件
生成阶段:生成构建环境
有关 cmake 的详细参数参见 cmake --help,本文仅对其中较难理解的选项加以描述。
2.1 缓存选项
CMake 支持缓存选项。在 CMake 中,如果一个变量被标记为「缓存」,则 cmake 的时候会将其写入到 CMakeCache.txt 文件中。当 cmake 命令寻找变量时,它会首先去 CMakeCache.txt 文件中寻找。cmake 创建缓存选项的格式如下:
1cmake -D <var>[:<type>]=<value> # <var>[:<type>]=<value> 具体参见下文「CMakeCache.txt 编写」
2.2 常用选项
-DCMAKE_BUILD_TYP ...
Padding策略
1. Zero Padding
均用 0 值填充。
2. Replicate Padding
用距离最近的像素值填充。
3. Mirror Padding
关于四边界成镜像对称,关于四角成镜像对称。
信息的统计度量
符号约定
符号
说明
X,Y,⋯X, Y, \cdotsX,Y,⋯
随机事件集合/随机变量
x,y,⋯x, y, \cdotsx,y,⋯
随机事件集合中的元素/随机变量的取值
p(x)p(x)p(x)
随机事件发生的概率
p(x∣y)p(x \vert y)p(x∣y)
随机事件发生的条件概率
p(xy),p(x,y)p(x y), p(x, y)p(xy),p(x,y)
随机事件发生的联合概率
概念说明
名称
说明
自信息量
随机事件集合 XXX 中某一个事件 xxx 的信息量,表示事件 xxx 的不确定性
互信息量
随机事件集合 XXX 中事件 xxx 包含事件 yyy 的信息量,表示事件 xxx 和事件 yyy 共有的不确定性
熵
随机事件集合 XXX 中所有事件自信息量的平均值,表示随机事件集合 XXX 的平均不确定性
互信息
随机事件集合 XXX 包含随机事件集合 YYY 的熵,表示随机事件集合 XXX 与 YYY 共有的平均不确实性
1. 随机事件
1.1 信息量与不确定度
事件发生的概率越 ...
PCA模型
1. 简介
主成分分析是指将数据中相关性很高的属性/变量转化成彼此相互独立或不相关的新属性/变量,利用较少的新属性/变量(主成分)去解释原来数据中的大部分属性/变量的一种降维方法。
2. 原理
2.1 基础思想
以学校课程为例,用 x1,x2,⋯ ,xp{x_1,x_2,\cdots,x_p}x1,x2,⋯,xp 表示 p 门课程的成绩变量, c1,c2,⋯ ,cp{c_1,c_2,\cdots,c_p}c1,c2,⋯,cp 表示各门课程的权重,则成绩的加权和为
s=c1x1+c2x2+⋯+cpxp\begin{array}{c}
s = c_1x_1 + c_2x_2 + \cdots + c_px_p
\end{array}
s=c1x1+c2x2+⋯+cpxp
现在希望能够选择合适的权重来更好的区分学生的成绩 s1,s2,⋯ ,sn{s_1,s_2,\cdots,s_n}s1,s2,⋯,sn( nnn 为学生人数且 n>p{n \gt p}n>p)。一般来说,如果这些值很分散,则表明区分的好。故需要寻找这样的加权,使得 s1,s2,⋯ ...
凸函数及其性质
1. 定义
1.1 上凸函数
如果对任意 x1x_1x1、x2x_2x2 总有 f[αx1+(1−α)x2]≥αf(x1)+(1−α)f(x2)f[\alpha x_1 + (1 - \alpha )x_2] \geq \alpha f(x_1) + (1 - \alpha )f(x_2)f[αx1+(1−α)x2]≥αf(x1)+(1−α)f(x2),其中 0≤α≤10 \leq \alpha \leq 10≤α≤1,则称 f(x)f(x)f(x) 为上凸函数。
如果对任意 x1x_1x1、x2x_2x2 且 x1≠x2x_1 \ne x_2x1=x2,总有 f[αx1+(1−α)x2]>αf(x1)+(1−α)f(x2)f[\alpha x_1 + (1 - \alpha )x_2] \gt \alpha f(x_1) + (1 - \alpha )f(x_2)f[αx1+(1−α)x2]>αf(x1)+(1−α)f(x2),其中 0<α<10 \lt \alpha \lt 10<α<1,则称 f(x)f(x ...
欧拉函数
1. 欧拉函数定义
欧拉函数 ϕ(n){\phi(n)}ϕ(n) 表示的是小于等于 nnn 且和 nnn 互质的正整数的个数。(易知 ϕ(1)=1{\phi(1) = 1}ϕ(1)=1)
2. 欧拉函数公式
对于任意整数 nnn,若其质因数分解结果为 n=p1k1p2k1⋯pnkn{n = p_1^{k_1}p_2^{k_1} \cdots p_n^{k_n}}n=p1k1p2k1⋯pnkn,则欧拉函数公式为
ϕ(n)=n(1−1p1)(1−1p2)⋯(1−1pn)\begin{array}{c}
\phi(n) = n(1-{1 \over p_1})(1- {1 \over p_2}) \cdots (1-{1 \over p_n})
\end{array}
ϕ(n)=n(1−p11)(1−p21)⋯(1−pn1)
3. 欧拉函数性质
(1)欧拉函数为积性函数。(对于数论函数 f(n){f(n)}f(n) 不恒等于 0,当 (m,n)=1{(m,n) = 1}(m,n)=1 时,满足 f(mn)=f(m)f(n){f(mn) = f(m)f(n)}f(mn ...
传染病模型
基础定义
将传染病范围内的人群分为以下类别:
SSS(Susceptible)类:指未得病,但与感染者接触后容易收到感染的人。
EEE(Exposed)类:指接触过感染者,但暂时没有传播的能力的人。
III(Infectious)类:指染上传染病,具有传播能力的人。(可以传播给SSS类人员,将其变成EEE类或III类成员)
RRR(Recovered / Removed)类:指病愈而具有免疫力的人或被隔离的移出者。(如果免疫期有限,RRR类人员可以重新变为SSS类)
常见模型
1. SI模型
1.1 模型假设
将人群分为SSS类和III类,在疾病传播期内所考察地区的总人数KKK不变(即不考虑生死和迁移)。时刻ttt这两类人群人数分别记为S(t)S(t)S(t)和I(t)I(t)I(t)。
每个传染病患者每天有效接触的平均人数为β\betaβ(称为日接触率)。当传染病患者与健康人接触会将健康人感染为传染病患者。
初始时刻传染病患者人数为I0I_0I0。
1.2 模型建立
由以上假设可建立如下的微分方程:
dI(t)dt=βI(t)S(t)KS(t)+I(t)=K ...
刚性方程
摘自Wikipedia——刚性方程。
1. 定义
在数学领域中,刚性方程(stiffness equation)是指一个微分方程,其数值分析的解只有在时间间隔很小时才会稳定,只要时间间隔略大,其解就会不稳定。目前很难去精确地去定义哪些微分方程是刚性方程,然而粗略而言,若此方程式中包含使其快速变动的项,则其为刚性方程。
在积分微分方程时,若某一区域的解曲线的变化很大,会希望在这个区域的积分间隔密一些,若另一区域的曲线近似直线,且斜率接近零,会希望在这个区域的积分间隔松一些。不过针对一些问题,就算曲线近似直线,仍然需要用非常小的积分间隔来积分,这种现象称为“刚性”。有时可能会出现两个不同问题,一个有“刚性”,另一个没有,但两个问题却有同一个解的情形。因此“刚性”不是解本身的特性,而是微分方程的特性,也可以称为是刚性系统。
2. 举例
考虑如下初值问题:
y′=−15y(t),t≥0,y(0)=1\begin{array}{c}
y^{'} = -15y(t), t \geq 0, y(0) = 1
\end{array}
y′=−15y(t),t≥0,y(0)=1
其精确解 ...
浮点数
1. IEEE 754 标准
IEEE 754 浮点标准用 V=(−1)s×M×2EV = (-1)^s \times M \times 2^EV=(−1)s×M×2E 的形式来表示一个数。
符号位(s):指明数的正负,即 VVV 中的 sss。
阶码(exp):对浮点数加权,即 VVV 中的 EEE。
尾数(frac):二进制小数,即 VVV 中的 MMM,范围为 1∼2−ε1 \sim 2 - \varepsilon1∼2−ε(规格化数),或者是 0∼1−ε0 \sim 1 - \varepsilon0∼1−ε(非规格化数),其中 ε=2−∣frac∣\varepsilon = 2^{-|frac|}ε=2−∣frac∣,∣frac∣|frac|∣frac∣ 为尾数所占有的位数。
2. 浮点数数值分类
以单精度为例:
2.1 规格化的值
阶码的位模式(二进制码)既不全为 0 也不全为 1 。
阶码的值 E=e−BiasE = e - BiasE=e−Bias 。其中 eee 为阶码的位模式对应的无符号数;Bias=2k−1−1Bias = 2^{k-1} ...
PyTorch函数
torch.clamp(input, min, max, out=None) → Tensor
将 input 张量中的每个元素值截断到区间 [min, max] 中。
torch.stack(tensors, dim=0, out=None) → Tensor
对 tensors 沿指定维度拼接,但会额外增加一维拼接的维度,即拼接时来自于 tensors 中每个 tensor 中的拼接元素单独组成一个维度。
torch.cat(tensors, dim=0, out=None) → Tensor
对 tensors 沿指定维度拼接,返回的 Tensor 维度不变,即拼接时直接将 tensors 中每个 tensor 的对应维度的元素拼接在一起。
torch.squeeze(input, dim=None, out=None) → Tensor
dim = None:去除 input 张量中所有 size 为 1 的维度。
指定 dim 时:若该维度 size 为 1 则去除,否则保持 input 张量不变。
torch.unsqueeze(input, dim) → Tensor ...