diff --git a/algorithm/12、动态规划.md b/algorithm/12、动态规划.md
new file mode 100644
index 0000000..4070354
--- /dev/null
+++ b/algorithm/12、动态规划.md
@@ -0,0 +1,41 @@
+##
动态规划
+
+ 暴力递归就是尝试,暴力递归是动态规划的基础,暴力递归加上合理的剪枝和缓存就是动态规划。
+
+
+### 暴力递归的步骤
+
+* 把问题转化为规模缩小了的同类问题的子问题
+* 有明确的不需要继续进行递归的条件(base case,递归终止条件)
+* 有当得到了子问题的结果之后的决策过程
+* 不记录每一个子问题的解
+
+### 暴力递归的几个常见问题
+
+#### 1、汉诺塔问题
+
+ 打印n层汉诺,塔从最左边移动到最右边的全部过程,每次只能移动一个圆盘,不能出现大盘叠在小盘上面的情况。可以分为3个步骤。
+
+* 将1-> n-1 移动到中间
+* 将n移动到右边
+* 将1-> n-1移动到右边
+
+#### 2、打印一个字符串的全部子序列
+
+ 依次考察每一个字符是否被选中,递归逻辑可以画成整颗二叉树。每次递归前移除当前字符,递归完以后恢复当前字符。
+
+#### 3、打印一个字符串的全部子序列,要求不要出现重复字面值的子序列
+
+ 同上,加上set去重
+
+#### 4、打印一个字符串的全部排列
+
+ 使用index和index后面的字符交换位置,index递增达到递归目的,index=str.length为递归终止条件。
+
+#### 5、打印一个字符串的全部排列,要求不要出现重复的排列
+
+ 加上visited数组去重,避免重复的字符进行交换。
+
+#### 6、反转栈,不能使用额外集合,只能使用递归函数
+
+ 两个递归函数,reverse使用f函数拿到栈底元素,然后递归,将栈底元素压栈。利用局部变量保存栈底元素,系统函数调用栈保证所有元素逆序。f函数拿到栈底元素,并保证其他元素顺序不变。