浅谈什么是动态规划以及相关的「股票」算法题

This commit is contained in:
misterbooo 2019-05-07 20:26:38 +08:00
parent d207212717
commit 1c20a18367
3 changed files with 50 additions and 43 deletions

View File

@ -2,23 +2,27 @@
# 浅谈什么是动态规划以及相关的「股票」算法题
> 本文首发于公众号「五分钟学算法」,是[图解 LeetCode ](<https://github.com/MisterBooo/LeetCodeAnimation>)系列文章之一。
>
> 个人网站:[https://www.cxyxiaowu.com](https://www.cxyxiaowu.com)
## 动态规划
### 1 概念
**动态规划**算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。在学习动态规划之前需要明确掌握几个重要概念。
**阶段**对于一个完整的问题过程,适当的切分为若干个相互联系的子问题,每次在求解一个子问题,则对应一个阶段,整个问题的求解转化为按照阶段次序去求解。
**阶段**对于一个完整的问题过程,适当的切分为若干个相互联系的子问题,每次在求解一个子问题,则对应一个阶段,整个问题的求解转化为按照阶段次序去求解。
**状态**状态表示每个阶段开始时所处的客观条件,即在求解子问题时的已知条件。状态描述了研究的问题过程中的状况。
**状态**状态表示每个阶段开始时所处的客观条件,即在求解子问题时的已知条件。状态描述了研究的问题过程中的状况。
**决策**决策表示当求解过程处于某一阶段的某一状态时,可以根据当前条件作出不同的选择,从而确定下一个阶段的状态,这种选择称为决策。
**决策**决策表示当求解过程处于某一阶段的某一状态时,可以根据当前条件作出不同的选择,从而确定下一个阶段的状态,这种选择称为决策。
**策略**由所有阶段的决策组成的决策序列称为全过程策略,简称策略。
**策略**由所有阶段的决策组成的决策序列称为全过程策略,简称策略。
**最优策略**在所有的策略中,找到代价最小,性能最优的策略,此策略称为最优策略。
**最优策略**在所有的策略中,找到代价最小,性能最优的策略,此策略称为最优策略。
**状态转移方程**状态转移方程是确定两个相邻阶段状态的演变过程,描述了状态之间是如何演变的。
**状态转移方程**状态转移方程是确定两个相邻阶段状态的演变过程,描述了状态之间是如何演变的。
### 2 使用场景
@ -134,7 +138,7 @@ class Solution {
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
**注意**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
**注意**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
**示例 1:**
@ -286,7 +290,4 @@ class Solution {
###
![](https://bucket-1257126549.cos.ap-guangzhou.myqcloud.com/blog/fz0rq.png)

View File

@ -2,23 +2,27 @@
# 浅谈什么是动态规划以及相关的「股票」算法题
> 本文首发于公众号「五分钟学算法」,是[图解 LeetCode ](<https://github.com/MisterBooo/LeetCodeAnimation>)系列文章之一。
>
> 个人网站:[https://www.cxyxiaowu.com](https://www.cxyxiaowu.com)
## 动态规划
### 1 概念
**动态规划**算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。在学习动态规划之前需要明确掌握几个重要概念。
**阶段**对于一个完整的问题过程,适当的切分为若干个相互联系的子问题,每次在求解一个子问题,则对应一个阶段,整个问题的求解转化为按照阶段次序去求解。
**阶段**对于一个完整的问题过程,适当的切分为若干个相互联系的子问题,每次在求解一个子问题,则对应一个阶段,整个问题的求解转化为按照阶段次序去求解。
**状态**状态表示每个阶段开始时所处的客观条件,即在求解子问题时的已知条件。状态描述了研究的问题过程中的状况。
**状态**状态表示每个阶段开始时所处的客观条件,即在求解子问题时的已知条件。状态描述了研究的问题过程中的状况。
**决策**决策表示当求解过程处于某一阶段的某一状态时,可以根据当前条件作出不同的选择,从而确定下一个阶段的状态,这种选择称为决策。
**决策**决策表示当求解过程处于某一阶段的某一状态时,可以根据当前条件作出不同的选择,从而确定下一个阶段的状态,这种选择称为决策。
**策略**由所有阶段的决策组成的决策序列称为全过程策略,简称策略。
**策略**由所有阶段的决策组成的决策序列称为全过程策略,简称策略。
**最优策略**在所有的策略中,找到代价最小,性能最优的策略,此策略称为最优策略。
**最优策略**在所有的策略中,找到代价最小,性能最优的策略,此策略称为最优策略。
**状态转移方程**状态转移方程是确定两个相邻阶段状态的演变过程,描述了状态之间是如何演变的。
**状态转移方程**状态转移方程是确定两个相邻阶段状态的演变过程,描述了状态之间是如何演变的。
### 2 使用场景
@ -97,14 +101,14 @@
所以我们只要考虑当天买和之前买哪个收益更高,当天卖和之前卖哪个收益更高。
* buy = max(buy, -price[i]) (注意:根据定义 buy 是负数)
* sell = max(sell, prices[i] + buy)
- buy = max(buy, -price[i]) (注意:根据定义 buy 是负数)
- sell = max(sell, prices[i] + buy)
#### 边界
第一天 `buy = -prices[0]`, `sell = 0`,最后返回 sell 即可。
###代码实现
### 代码实现
```java
class Solution {
@ -134,7 +138,7 @@ class Solution {
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
**注意**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
**注意**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
**示例 1:**
@ -257,11 +261,10 @@ class Solution {
#### 边界
* 一开始 `fstBuy = -prices[0]`
* 买入后直接卖出,`fstSell = 0`
* 买入后再卖出再买入,`secBuy - prices[0]`
* 买入后再卖出再买入再卖出,`secSell = 0`
- 一开始 `fstBuy = -prices[0]`
- 买入后直接卖出,`fstSell = 0`
- 买入后再卖出再买入,`secBuy - prices[0]`
- 买入后再卖出再买入再卖出,`secSell = 0`
最后返回 secSell 。
@ -286,7 +289,7 @@ class Solution {
###
![](https://bucket-1257126549.cos.ap-guangzhou.myqcloud.com/blog/fz0rq.png)

View File

@ -2,23 +2,27 @@
# 浅谈什么是动态规划以及相关的「股票」算法题
> 本文首发于公众号「五分钟学算法」,是[图解 LeetCode ](<https://github.com/MisterBooo/LeetCodeAnimation>)系列文章之一。
>
> 个人网站:[https://www.cxyxiaowu.com](https://www.cxyxiaowu.com)
## 动态规划
### 1 概念
**动态规划**算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。在学习动态规划之前需要明确掌握几个重要概念。
**阶段**对于一个完整的问题过程,适当的切分为若干个相互联系的子问题,每次在求解一个子问题,则对应一个阶段,整个问题的求解转化为按照阶段次序去求解。
**阶段**对于一个完整的问题过程,适当的切分为若干个相互联系的子问题,每次在求解一个子问题,则对应一个阶段,整个问题的求解转化为按照阶段次序去求解。
**状态**状态表示每个阶段开始时所处的客观条件,即在求解子问题时的已知条件。状态描述了研究的问题过程中的状况。
**状态**状态表示每个阶段开始时所处的客观条件,即在求解子问题时的已知条件。状态描述了研究的问题过程中的状况。
**决策**决策表示当求解过程处于某一阶段的某一状态时,可以根据当前条件作出不同的选择,从而确定下一个阶段的状态,这种选择称为决策。
**决策**决策表示当求解过程处于某一阶段的某一状态时,可以根据当前条件作出不同的选择,从而确定下一个阶段的状态,这种选择称为决策。
**策略**由所有阶段的决策组成的决策序列称为全过程策略,简称策略。
**策略**由所有阶段的决策组成的决策序列称为全过程策略,简称策略。
**最优策略**在所有的策略中,找到代价最小,性能最优的策略,此策略称为最优策略。
**最优策略**在所有的策略中,找到代价最小,性能最优的策略,此策略称为最优策略。
**状态转移方程**状态转移方程是确定两个相邻阶段状态的演变过程,描述了状态之间是如何演变的。
**状态转移方程**状态转移方程是确定两个相邻阶段状态的演变过程,描述了状态之间是如何演变的。
### 2 使用场景
@ -97,14 +101,14 @@
所以我们只要考虑当天买和之前买哪个收益更高,当天卖和之前卖哪个收益更高。
* buy = max(buy, -price[i]) (注意:根据定义 buy 是负数)
* sell = max(sell, prices[i] + buy)
- buy = max(buy, -price[i]) (注意:根据定义 buy 是负数)
- sell = max(sell, prices[i] + buy)
#### 边界
第一天 `buy = -prices[0]`, `sell = 0`,最后返回 sell 即可。
###代码实现
### 代码实现
```java
class Solution {
@ -134,7 +138,7 @@ class Solution {
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
**注意**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
**注意**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
**示例 1:**
@ -257,11 +261,10 @@ class Solution {
#### 边界
* 一开始 `fstBuy = -prices[0]`
* 买入后直接卖出,`fstSell = 0`
* 买入后再卖出再买入,`secBuy - prices[0]`
* 买入后再卖出再买入再卖出,`secSell = 0`
- 一开始 `fstBuy = -prices[0]`
- 买入后直接卖出,`fstSell = 0`
- 买入后再卖出再买入,`secBuy - prices[0]`
- 买入后再卖出再买入再卖出,`secSell = 0`
最后返回 secSell 。
@ -286,7 +289,7 @@ class Solution {
###
![](https://bucket-1257126549.cos.ap-guangzhou.myqcloud.com/blog/fz0rq.png)