• 当算法问题给出时,其实也就相当于给出了函数的输入和输出,也就是整个函数的接口形式。

    • 比如通配符范式与字符串的匹配问题,
      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. 分治:一刀两断

所谓一刀两断,将原始(针对于 n 的)问题,从中间横竖一切,求 f(n)f(n/2) 之间的数学关系,比如著名的 1+2+…+n,则可知:

f(n)=f(n/2)+n2n2f(n/2)

3. 动态规划

  • 斐波那契
  • 二项式系数

4. 问题规模约简(deduction)的策略

  • 以每个数字为单位分割 f(n) f(n-1)
  • 二等分(简单粗暴,横竖就是中间一刀)
    f(n) f(n/2)

  • 对于有关一维问题(n)的情况,

    • 分治:n ⇒ n/2
    • 动态规划(常常伴随递归):n ⇒ n-1
  • 对于有关二维问题((n,s))的情况,

    • 动态规划(递归):(n?,s1) 或者 (n1,s?)

对于动态规划(常常伴随递归)问题的规模总是在不断减小,也即变成规模更小的子问题(subproblems),当然对于动态规划而言,子问题之间存在大量的重复计算,规模更小的子问题,具有相似的求解结构;

5. 旅行商问题

  • 维护结点(城市)是否被访问过;

    bool visited[n];
posted on 2016-09-06 08:56  未雨愁眸  阅读(344)  评论(0编辑  收藏  举报