<aside> 💡 浙江大学算法设计MOOC笔记 + 代码随想录思考

</aside>

<aside>

枚举

</aside>

<aside>

分治

<aside>

二分

递归与回溯

递归函数

<aside>

替代多重循环,如:n皇后问题。

<aside>

解决实质是递归形式的问题

分解子问题

<aside> 💡 附注

  1. atof函数,将浮点串转变为浮点数
  2. cin.peek函数,提前预知输入而非读取
  3. 浮点数的比较引入eps </aside>

回溯法

一般可以解决如下几种问题:

回溯法的解题模板大致如下:路径+递归函数+中间结果

 class Solution {
	public:
		vector<int> path; // 回溯路径
		int value; // 中间结果
		vector<int> solutions; // 保存结果
		
		// 递归决策函数
		void choose(vector<int> &searchSpace, int start) {
			// 终止判别
			if (done(start)) {
				solutions.push_back(value);
				return;
			}
			
			// 同层决策循环
			for (int i = start; i < searchSpace.size(); i++) {
			  if (!prune(i)) { // 剪枝
				  // 保存
					path.push_back();
					update(value);
					// 递归
					choose(searchSpace, i + 1);
					// 回溯
					resume(value);
					path.pop_back();
				}
				
			vector<int> solve(vector<int> &searchSpace) {
				int start; // 搜索起始点
				initialize(path, value, start);
				choose(searchSpace, start);
				return solutions;
 }

动态规划 DP

<aside>

什么问题适合用 DP?


<aside>

DP 程序写法

<aside>

记忆递归型

递归函数+记忆数组

</aside>

<aside>

“人人为我”递推型

1,2,3,...,n-1 => n

递推到“n”时“n”仍未被求出,前面已被求出的状态值用于求“n”的状态值

</aside>

<aside>

</aside>

</aside>