-
动态规划
+
动态规划
-- 状态表示f[i,j]
+
- 状态表示$f[i,j]$
- 集合
- 属性(Max,Min,Cnt)
@@ -101,45 +101,45 @@ 动
-
线性DP
+
线性DP
数字三角形
-
O(n2)
-
f[i,j]表示到坐标为[i,j]的路径的和最大值
-
f[1][1]=a[1][1]
-
f[i][j]=max(f[i−1][j−1]+a[i][j],f[i−1][j]+a[i][j])
+
$O(n^2)$
+
$f[i,j]$表示到坐标为$[i,j]$的路径的和最大值
+
$f[1][1] = a[1][1]$
+
$f[i][j] = max(f[i-1][j-1]+a[i][j], f[i-1][j]+a[i][j])$
最长上升子序列
-
朴素:O(n2)
-
f[i]表示以第i个数结尾的序列中上升子序列长度的最大值
-
遍历ai所有可能的前一个数aj(aj<ai且0≤j≤i−1)
-
f[i]=max(f[j]+1,f[i]),j∈[0,i−1]
-
如果要保存最长序列:g[i]保存从哪一步j转移过来
+
朴素:$O(n^2)$
+
$f[i]$表示以第$i$个数结尾的序列中上升子序列长度的最大值
+
遍历$a_i$所有可能的前一个数$a_j$($a_j<a_i$且$0 \le j \le i-1$)
+
$f[i] = max(f[j]+1,f[i]),j \in [0,i-1]$
+
如果要保存最长序列:$g[i]$保存从哪一步$j$转移过来
代码:https://www.luogu.com.cn/record/124595657
-
优化:O(nlogn)
+
优化:$O(nlogn)$
用一个q数组储存长度为i的序列的结尾数字的最小值
-
可以证明qi>qi−1>...>q2>q1,即数组严格单调递增
-
对于ai,二分找到最大的qk<=ai,f[i]=k+1,更新qk=ai
+
可以证明$q_i>q_{i-1}>...>q_2>q_1$,即数组严格单调递增
+
对于$a_i$,二分找到最大的$q_k<=a_i$,$f[i] = k+1$,更新$q_k = a_i$
代码:https://www.luogu.com.cn/record/133704642
最长公共子序列
-
朴素:O(n2)
-
f[i][j]表示所有在第一个序列的前i个字母中出现,且在第二个序列的前j个字母中出现的子序列的最大值
-
集合划分依据:是否选择a[i],b[j]
-
分为四个集合:选择a[i],b[j] ; 选择a[i] 不选择b[j] ; 不选择a[j]选择b[j] ; 都不选择a[i],b[j]
-
分别表示为 f[i−1][j−1],f[i,j−1],f[i−1][j],f[i−1][j−1]+1
+
朴素:$O(n^2)$
+
$f[i][j]$表示所有在第一个序列的前i个字母中出现,且在第二个序列的前j个字母中出现的子序列的最大值
+
集合划分依据:是否选择$a[i],b[j]$
+
分为四个集合:选择$a[i],b[j]$ ; 选择$a[i]$ 不选择$b[j]$ ; 不选择$a[j]$选择$b[j]$ ; 都不选择$a[i],b[j]$
+
分别表示为 $f[i-1][j-1] , f[i,j-1] , f[i-1][j] , f[i-1][j-1]+1$
其中第二三种情况包含上面对应的集合(由于是求Max,所以有重复不影响结果)
且第二三种集合也包含第一个集合,所以只要对后三种集合求最大值即可
-
f[i,j]=max(f[i−1,j],f[i,j−1])
-
当a[i]==b[j]时,f[i,j]=max(f[i,j],f[i−1,j−1]+1)
-
优化:O(nlogn)
+
$f[i,j] = max(f[i-1,j],f[i,j-1])$
+
当$a[i]==b[j]$时,$f[i,j] = max(f[i,j],f[i-1,j-1]+1)$
+
优化:$O(nlogn)$
编辑距离
-
f[i,j]所有将a[1−i]变成b[1−j]的操作方式的最小步数
+
$f[i,j]$所有将$a[1-i]$变成$b[1-j]$的操作方式的最小步数
区间划分,①删除最后一个数、②增加最后一个数、③修改最后一个数
-
① f[i−1,j]+1
-
②f[i,j−1]+1
-
③f[i−1,j−1]+1 (如果a[i]==b[j]则不需要加一,即不需要进行修改操作)
-
区间DP
+
① $f[i-1,j]+1$
+
②$f[i,j-1]+1$
+
③$f[i-1,j-1]+1$ (如果$a[i]==b[j]$则不需要加一,即不需要进行修改操作)
+
区间DP
石子合并
-
f[i,j]表示将第i堆石子到第j堆石子合并成一堆石子的方式的代价最小值/最大值
-
O(n3)
+
$f[i,j]$表示将第$i$堆石子到第$j$堆石子合并成一堆石子的方式的代价最小值/最大值
+
$O(n^3)$
for(int len=2;len<=n;len++){
for(int i=1;i+len-1<=n;i++){
int l = i,r = i+len-1;
@@ -150,41 +150,41 @@ 区间DP}
}
}
-
计数类DP
-
数位统计DP
+
计数类DP
+
数位统计DP
计数问题
-
设n=abcdefg,枚举第i位是 x∈[0,9]
-
举例x=1,i=4的情况:
-
设数字为xxx1yyy
+
设$n=abcdefg$,枚举第$i$位是 $x \in [0,9]$
+
举例$x=1,i=4$的情况:
+
设数字为$xxx1yyy$
-- 当abc>xxx,xxx∈[000,abc−1],y∈[000,999],则共有abc∗1000个
-- 当abc<xxx,则共有0个
-- 当abc=xxx
+
- 当$abc>xxx,xxx \in [000,abc-1], y \in [000,999]$,则共有$abc * 1000$个
+- 当$abc<xxx$,则共有0个
+- 当$abc=xxx$
-- 当d<1,无解
-- 当d=1,yyy∈[000,efg],则有efg+1种
-- 当d>1,yyy∈[000,999],有1000种
+- 当$d<1$,无解
+- 当$d=1$,$yyy \in [000,efg]$,则有$efg+1$种
+- 当$d>1$,$yyy \in [000,999]$,有1000种
-
当x=0时,注意前导0,即对于第一种情况,xxx∈[001,abc−1],即有(abc−1)∗1000情况
+
当x=0时,注意前导0,即对于第一种情况,$xxx \in [001,abc-1]$,即有$(abc-1)*1000$情况
圆形数字
-
状态压缩DP
+
状态压缩DP
蒙德里安的梦想
-
f[i][j]表示第i列,上一列横着摆的数量j,其中j是一个二进制数。
+
$f[i][j]$表示第i列,上一列横着摆的数量j,其中j是一个二进制数。
最短Hamilton路径
-
f[i][j]表示从0号点走到j号点,走过的所有点是i的所有路径(二进制数i表示某个点是否已经走过了)的最小路径长度
-
树形DP
+
$f[i][j]$表示从0号点走到j号点,走过的所有点是i的所有路径(二进制数i表示某个点是否已经走过了)的最小路径长度
+
树形DP
没有上司的舞会
-
f[u][0]表示所有以u为根的子树中选择,并且不选u这个点的方案的最大值
-
f[u][1]表示所有以u为根的子树中选择,并且选u这个点的方案的最大值
-
设点u的子节点s1,s2,s3....si
-
f[u][0]=∑1imax(f[si][0],f[si][1])
-
f[u][1]=∑1if[si][0]
+
$f[u][0]$表示所有以u为根的子树中选择,并且不选u这个点的方案的最大值
+
$f[u][1]$表示所有以u为根的子树中选择,并且选u这个点的方案的最大值
+
设点u的子节点$s_1,s_2,s_3....s_i$
+
$f[u][0] = \sum_{1}^{i}max(f[s_i][0],f[s_i][1])$
+
$f[u][1] = \sum_{1}^{i}f[s_i][0]$
找出根节点,递归求最大值即可
-
记忆化搜索
+
记忆化搜索
滑雪
-
用s[i][j]表示从(i,j)点出发能走的最长距离。
+
用$s[i][j]$表示从(i,j)点出发能走的最长距离。
每次搜索一次记忆一次即可。
举例
3 3
@@ -197,15 +197,15 @@
diff --git a/algorithm-high-precision/index.html b/algorithm-high-precision/index.html
deleted file mode 100644
index 008abda..0000000
--- a/algorithm-high-precision/index.html
+++ /dev/null
@@ -1,299 +0,0 @@
-
-
-
-