点分治题表

poj1741: tree
bzoj2152: 聪聪可可
bzoj2599: [IOI2011]Race
[SPOJ1825]免费旅行
bzoj4016: [FJOI2014]最短路径树问题 (字典序挺骚)

 

转载于:https://www.cnblogs.com/TSHugh/p/8179241.html

### 经典递归与分治算法例及解法 #### 斐波那契数列 斐波那契数列是一个经典的递归问。其定义如下: \[ F(n) = \begin{cases} 0 & n=0 \\ 1 & n=1 \\ F(n-1)+F(n-2) & n>1 \end{cases} \] ##### 递归实现 递归方法简单直观,但效率较低,因为存在大量重复计算。 ```python def fibonacci_recursive(n): if n == 0: return 0 elif n == 1: return 1 else: return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2) ``` ##### 迭代实现 迭代方式通过循环逐步求解,避免了递归中的冗余计算,时复杂度为 \(O(n)\)[^2]。 ```python def fibonacci_iterative(n): a, b = 0, 1 for _ in range(n): a, b = b, a + b return a ``` --- #### 归并排序(Merge Sort) 归并排序是一种典型的分治算法应用案例。它将数分成两半分别排序后再合并。 ##### 实现代码 ```python def merge_sort(arr): if len(arr) <= 1: return arr mid = len(arr) // 2 left_half = merge_sort(arr[:mid]) # 左侧子数递归排序 right_half = merge_sort(arr[mid:]) # 右侧子数递归排序 return merge(left_half, right_half) def merge(left, right): result = [] while left and right: if left[0] < right[0]: result.append(left.pop(0)) else: result.append(right.pop(0)) result.extend(left or right) return result ``` 上述代码展示了如何利用分治的思想解决问[^3]。 --- #### 快速排序(Quick Sort) 快速排序也是一种基于分治思想的经典排序算法。它的核心在于选取一个基准值,将数分为小于基准值的部分和大于基准值的部分,然后再对这两部分递归处理。 ##### 实现代码 ```python def quick_sort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) ``` --- #### 最近对问 最近对问是另一个常见的分治算法应用场景。给定平面上的一,找到距离最短的两个。 ##### 解决思路 1. 将所有按横坐标排序; 2. 对于每一步,递归地寻找左侧和右侧区域内的最小距离; 3. 合并阶段考虑跨越中线的情况。 --- #### 汉诺塔问 汉诺塔问也是一个经典的递归例子。目标是从一根柱子上移动一系列盘子到另一根柱子,遵循以下规则: 1. 每次只能移动一个盘子; 2. 较大的盘子不能放在较小的盘子上面。 ##### 实现代码 ```python def hanoi_tower(n, source, target, auxiliary): if n == 1: print(f"Move disk 1 from {source} to {target}") return hanoi_tower(n - 1, source, auxiliary, target) print(f"Move disk {n} from {source} to {target}") hanoi_tower(n - 1, auxiliary, target, source) ``` --- #### 力扣经典目推荐 以下是力扣上的几道涉及递归与分治的经典目: 1. **LeetCode 53. Maximum Subarray** 使用分治策略可以高效解决最大子数和问[^4]。 2. **LeetCode 973. K Closest Points to Origin** 应用分治思想优化查找最近的过程。 3. **LeetCode 240. Search a 2D Matrix II** 基于矩阵特性设计高效的分治搜索方案。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值