1.装载问题 把n件物品装入容量为c1和c2的轮船,问能否将n件物品全部装入。 可以采用回溯法,每个物品装或者不装。 时间复杂度: O(2^n) 2.n皇后 经典问题,尝试性地在第k行放下一个棋子,如果check成功,接着放下一行,否则,接着试探该行的其余位置。 按照教材做法,每次check是和前k个放置的比,要花O(n)时间check.但是由于对角线的斜率是一样的,可以开两个数组分别记录对角线有没有被涉及到。 时间复杂度: O(n * n!) -> O(n!) 3.0-1背包 0-1背包爆搜,每个物品选和不选。可以花O(n)的时间通过计算上界函数进行最优解剪枝、可行性剪枝,在Acwing上跑的竟然比dp快,不是很理解。 时间复杂度: O(n*2^n) 4.图的m着色问题 给定n个点的图,判断能否用不超过m种颜色进行染色。 对于每个点,都有m种颜色供选择,加之每次选择颜色后需要与和它相邻的点进行判断是否冲突。 可以进行等效冗余剪枝 ,对于任意三个点,染有红、黄、蓝三种颜色,在其他点不变的情况下,有3!种排列方式,不需要搜索完所有方案。 时间复杂度: O(n * m ^ n) 5.TSP 经典问题,直接模拟退火。 考虑爆搜,每条合法路径需是除起点外的permutation,而且终点与起点有边相连。所以是个permutation树。 时间复杂度: O(n!) 6.最大团问题 最大团问题 等价于 补图的最大点独立集合。 最大团首先是一个团,而且要满足是所有团种的最大。团的定义是一个局部最大的完全子图。 一言以蔽之,直接爆搜每个点选还是不选,之后花O(n)的时间check当前方案是否满足是一个clique. 时间复杂度: O(n * 2 ^ n) 7.圆排列 给定n个圆,n个圆之间两两相切,求最小的圆排列长度。都没看懂那个最小的圆排列长度啥意思,是指最右边的圆 与 最左边的圆的圆心距。显然要求一个permutation。需要开一个数组额外求每个圆的圆心在何处。还要花O(n)时间找哪个圆在最右边哪个圆在最左边。 时间复杂度: O(n * n!)
|