解空间树
分治法
- 分解(Divide)步骤将问题分解为一些子问题,子问题的形式与原问题一样,只是规模更小
- 解决(Conquer)步骤递归地求解出子问题。如果子问题的规模足够小,则停止递归,直接求解
- 合并(Combine )步骤将子问题的解组合成原问题的解
引用自《算法导论》
通常的遇到的需要分治法解决的问题只需要一维的分解,比如解决斐波那契数列问题
1.1 动态规划:斐波那契数
解空间树:是依据待解决问题的特性,用树结构表示问题的解结构、用叶子表示问题的解的一颗树。
但有些问题需要进行二维的分解。其原因在于将父问题分解为子问题的切分点有多个,而不是像斐波那契问题那样有唯一的切分点。通常每个切分点对合并阶段都有影响。比如
241. 为运算表达式设计优先级。
graph TB
subgraph "f(2*3-4+5)=[8,-12,-3,7,3]"
id0(2*3-4+5)
end
subgraph "f((2)*(3-4+5))=[8,-12]"
id0-->id1(2)
id0-->id2(3-4+5)
subgraph "f(3-4+5)=[4,-6]"
id2
end
subgraph "f((3)-(4+5))=[-6]"
id2-->id7(3)
id2-->id8(4+5)
id8-->id15(4)
id8-->id16(5)
end
subgraph "f((3-4)+(5))=[4]"
id2-->id9(3-4)
id9-->id25(3)
id9-->id26(4)
id2-->id10(5)
end
end
subgraph "f((2*3)-(4+5))=[-3]"
id0-->id3(2*3)
id0-->id4(4+5)
id3-->id17(2)
id3-->id18(3)
id4-->id19(4)
id4-->id20(5)
end
subgraph "f((2*3-4)+(5))=[7,3]"
id0-->id5(2*3-4)
id0-->id6(5)
subgraph "f(2*3-4)=[2,-2]"
id5
end
subgraph "f((2)*(3-4))=[-2]"
id5-->id11(2)
id5-->id12(3-4)
id12-->id21(3)
id12-->id22(4)
end
subgraph "f((2*3)-(4))=[2]"
id5-->id13(2*3)
id13-->id23(2)
id13-->id24(3)
id5-->id14(4)
end
end
动态规划通常有两种实现方式,分支+记忆和填表