PKU ACM/ICPC暑假训练班总结

1 Day:动态规划

动态规划考虑三点:状态定义,如何决策,边界条件

该状态选取是否可行:是否是最优子结构,是否有“无后效性” (此状态后的状态递推与如何达成此状态无关)

如该状态无法递推或有漏解:加一维状态细化问题分类,即使状态更复杂

遇到空间时间不足:滚动数组,状态空间压缩(集合表示等)

两种实现方式:递归(+记忆化) ,递推

两种思想方式:人人为我型(即由已知推未知) ,我为人人型(即由已知更新未知)

递推顺序:根据决策顺序判断

状态定义常见例子:前i个,i~j个,0-1问题


2 Day:搜索

DFS:

剪枝最重要!!

剪枝包括:可行性剪枝,最优性剪枝,

常见可行性剪枝:在该点处已经不可以继续走到终点

常见最优性剪枝:该点处结果已经超过最优解,从该点处即使走最优解法已经超过最优解,在该点处已经超过之前走到该点的最优解

可能结合状态压缩(集合表示)方法


BFS:

判重最重要!!

常见判重方法:STL中set,Hash表,利用排序序号来编码解码,数组vis[][]


A*:

估价最重要!!

估价函数:f(n)=g(n) + h(n)  其中h(n)要相容

POJ例题:1376,1324,1084,2449,1475


迭代加深搜索:

即加上限度的DFS,因为可能问题状态数太多

POJ例题:2286


极大极小搜索法:

运用于博弈搜索中,比如:围棋,五子棋,象棋等, 结果有三种可能:胜利、失败和平局。

其中运用Alpha–beta剪枝


3 Day:线段树&树状数组

线段树:每个节点都是一个区间,树适用于和区间统计有关的问题

若区间的端点不是整数,或者区间太大导致建树内存开销过大而MLE ,那么就需要进行“离散化”后再建树。

树状数组:适合单个元素经常修改而且还反复要求部分的区间的和的情况。

树状数组∈线段树

关键:想清楚每个节点要存哪些信息,以及这些信息如何高效更新,维护,查询。不要一更新就更新到叶子节点,那样更新效率最坏就可能变成O(n)的了。


4 Day:并查集&DFA

并查集:集合问题

除了parent[]数组,一般都额外定义一个数组relation[]表示结点与父节点的关系

关键是getParent()函数中找根结点时同时更新relation[]中与根结点关系

和merge()函数中合并两个集合时relation[]中的变化








你可能感兴趣的:(杂七杂八的算法)