当算法问题给出时,其实也就相当于给出了函数的输入和输出,也就是整个函数的接口形式。
- 比如通配符范式与字符串的匹配问题,
bool match(const string& patterns, const string& str);
- 比如通配符范式与字符串的匹配问题,
一些特殊情况一定要考虑周全(if, if, if),不重不漏;
穷举 + 动态规划:
先利用穷举搜索法编写出检索所有答案的函数,然后利用制表的方法把算法变换成动态规划算法。
1. 穷举搜索
生成所有排列(permutation)
N! ,仅适用于 N 不超过 10 的场景,11!=39916800 ;生成所有组合(combination):C++组合数(combination)的实现
生成
2n 比如著名的 0/1 背包算法,当然时间复杂度会增加地十分迅速,并不是第一选择,仅提供一种理论上的可能性;
2. 分治:一刀两断
所谓一刀两断,将原始(针对于
3. 动态规划
- 斐波那契
- 二项式系数
4. 问题规模约简(deduction)的策略
- 以每个数字为单位分割 f(n)
⇔ f(n-1) 二等分(简单粗暴,横竖就是中间一刀)
f(n)⇔ f(n/2)对于有关一维问题(
n )的情况,- 分治:n ⇒ n/2
- 动态规划(常常伴随递归):n ⇒ n-1
对于有关二维问题(
(n,s) )的情况,- 动态规划(递归):
(n−?,s−1) 或者(n−1,s−?)
- 动态规划(递归):
对于动态规划(常常伴随递归)问题的规模总是在不断减小,也即变成规模更小的子问题(subproblems),当然对于动态规划而言,子问题之间存在大量的重复计算,规模更小的子问题,具有相似的求解结构;
5. 旅行商问题
维护结点(城市)是否被访问过;
bool visited[n];