Skip to content

Commit 76301c6

Browse files
author
AnfangRobkit
committed
dynamic programming
1 parent 2e1fb76 commit 76301c6

File tree

2 files changed

+24
-6
lines changed

2 files changed

+24
-6
lines changed

4.算法基础/week4/screen_shop_1

-36.4 KB
Binary file not shown.

4.算法基础/week4/动态规划.md

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1-
动态规划
1+
## 动态规划
2+
### 数字三角形
3+
问题背景:
4+
在数字三角形钟寻找一条从顶部到底部的路径,使得路径上经过的数字之和最大。
25

6+
#### 常用作法: 递归型动归
37
```cpp
48
#include<iostream>
59
#include<algorithm>
@@ -34,9 +38,13 @@ int main() {
3438
}
3539
```
3640
37-
递归转化为递推计算:
41+
此时存在的主要问题: 函数的调用需要大量的资源开销
3842
39-
![1565010076460](C:\Users\13269\Desktop\coursera_cpp\programming-and-algorithm\4.算法基础\week4\screen_shop_1)
43+
### 改进: 递归转化为递推计算:
44+
45+
![uCfsv6.png](https://s2.ax1x.com/2019/09/23/uCfsv6.png)
46+
47+
上图中右侧的矩阵为MaxSum 数组,记录了三角形中相应的数字到底边的最大,其中最后一行即为原始数据。此时的循环计算顺序为从上到下。
4048
4149
```cpp
4250
#include<iostream>
@@ -64,9 +72,9 @@ int main() {
6472
}
6573
```
6674

75+
考虑到空间优化,即不需要二维数组存放MaxSum,只需要一个一维数组。
6776

68-
69-
递归到动归的一般转化方法:
77+
**递归到动归的一般转化方法**
7078

7179
递归函数有n个参数,就定义一个n维的数组,数组的下标是递归函数参数的取值范围,数组元素的值是递归函数的返回值,这样就可以从边界值开始,逐步填充数组,相当于计算递归函数的逆过程。
7280

@@ -100,9 +108,19 @@ int main() {
100108

101109
### 最长公共子序列
102110

103-
111+
给出两个字符串,求出最长的公共子序列的长度: 子序列中的每个字符都能在两原串中找到,而且每个字符的先后顺序和原串中的先后顺序一致。
104112

113+
```cpp
114+
Sample Input:
115+
abcfbc abfcab
116+
programming contest
117+
118+
Sample Output:
119+
4
120+
2
121+
```
105122

123+
输入两个串s1,s2, 设MaxLen(i,j)表示: s1的左边i个字符形成的子串,与s2左边的j个字符形成的子串的最长公共子序列的长度(i,j从0开始算), MaxLen(i,j) 就是本题的“状态” 假定 len1 = strlen(s1),len2 = strlen(s2) ,那么题目就是要求 MaxLen(len1,len2)
106124

107125

108126

0 commit comments

Comments
 (0)