Skip to content

Commit

Permalink
浅谈什么是动态规划以及相关的「股票」算法题
Browse files Browse the repository at this point in the history
  • Loading branch information
MisterBooo committed May 7, 2019
1 parent d207212 commit 1c20a18
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 43 deletions.
23 changes: 12 additions & 11 deletions notes/LeetCode第121号问题:买卖股票的最佳时机.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,27 @@

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

> 本文首发于公众号「五分钟学算法」,是[图解 LeetCode ](<https://github.com/MisterBooo/LeetCodeAnimation>)系列文章之一。
>
> 个人网站:[https://www.cxyxiaowu.com](https://www.cxyxiaowu.com)
## 动态规划

### 1 概念

  **动态规划**算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。在学习动态规划之前需要明确掌握几个重要概念。

  **阶段**对于一个完整的问题过程,适当的切分为若干个相互联系的子问题,每次在求解一个子问题,则对应一个阶段,整个问题的求解转化为按照阶段次序去求解。
  **阶段**对于一个完整的问题过程,适当的切分为若干个相互联系的子问题,每次在求解一个子问题,则对应一个阶段,整个问题的求解转化为按照阶段次序去求解。

  **状态**状态表示每个阶段开始时所处的客观条件,即在求解子问题时的已知条件。状态描述了研究的问题过程中的状况。
  **状态**状态表示每个阶段开始时所处的客观条件,即在求解子问题时的已知条件。状态描述了研究的问题过程中的状况。

  **决策**决策表示当求解过程处于某一阶段的某一状态时,可以根据当前条件作出不同的选择,从而确定下一个阶段的状态,这种选择称为决策。
  **决策**决策表示当求解过程处于某一阶段的某一状态时,可以根据当前条件作出不同的选择,从而确定下一个阶段的状态,这种选择称为决策。

  **策略**由所有阶段的决策组成的决策序列称为全过程策略,简称策略。
  **策略**由所有阶段的决策组成的决策序列称为全过程策略,简称策略。

  **最优策略**在所有的策略中,找到代价最小,性能最优的策略,此策略称为最优策略。
  **最优策略**在所有的策略中,找到代价最小,性能最优的策略,此策略称为最优策略。

  **状态转移方程**状态转移方程是确定两个相邻阶段状态的演变过程,描述了状态之间是如何演变的。
  **状态转移方程**状态转移方程是确定两个相邻阶段状态的演变过程,描述了状态之间是如何演变的。

### 2 使用场景

Expand Down Expand Up @@ -134,7 +138,7 @@ class Solution {

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

**注意**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
**注意**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

**示例 1:**

Expand Down Expand Up @@ -286,7 +290,4 @@ class Solution {



###



![](https://bucket-1257126549.cos.ap-guangzhou.myqcloud.com/blog/fz0rq.png)
35 changes: 19 additions & 16 deletions notes/LeetCode第122号问题:买卖股票的最佳时机II.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,27 @@

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

> 本文首发于公众号「五分钟学算法」,是[图解 LeetCode ](<https://github.com/MisterBooo/LeetCodeAnimation>)系列文章之一。
>
> 个人网站:[https://www.cxyxiaowu.com](https://www.cxyxiaowu.com)
## 动态规划

### 1 概念

  **动态规划**算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。在学习动态规划之前需要明确掌握几个重要概念。

  **阶段**对于一个完整的问题过程,适当的切分为若干个相互联系的子问题,每次在求解一个子问题,则对应一个阶段,整个问题的求解转化为按照阶段次序去求解。
  **阶段**对于一个完整的问题过程,适当的切分为若干个相互联系的子问题,每次在求解一个子问题,则对应一个阶段,整个问题的求解转化为按照阶段次序去求解。

  **状态**状态表示每个阶段开始时所处的客观条件,即在求解子问题时的已知条件。状态描述了研究的问题过程中的状况。
  **状态**状态表示每个阶段开始时所处的客观条件,即在求解子问题时的已知条件。状态描述了研究的问题过程中的状况。

  **决策**决策表示当求解过程处于某一阶段的某一状态时,可以根据当前条件作出不同的选择,从而确定下一个阶段的状态,这种选择称为决策。
  **决策**决策表示当求解过程处于某一阶段的某一状态时,可以根据当前条件作出不同的选择,从而确定下一个阶段的状态,这种选择称为决策。

  **策略**由所有阶段的决策组成的决策序列称为全过程策略,简称策略。
  **策略**由所有阶段的决策组成的决策序列称为全过程策略,简称策略。

  **最优策略**在所有的策略中,找到代价最小,性能最优的策略,此策略称为最优策略。
  **最优策略**在所有的策略中,找到代价最小,性能最优的策略,此策略称为最优策略。

  **状态转移方程**状态转移方程是确定两个相邻阶段状态的演变过程,描述了状态之间是如何演变的。
  **状态转移方程**状态转移方程是确定两个相邻阶段状态的演变过程,描述了状态之间是如何演变的。

### 2 使用场景

Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -134,7 +138,7 @@ class Solution {

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

**注意**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
**注意**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

**示例 1:**

Expand Down Expand Up @@ -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 。

Expand All @@ -286,7 +289,7 @@ class Solution {



###
![](https://bucket-1257126549.cos.ap-guangzhou.myqcloud.com/blog/fz0rq.png)



35 changes: 19 additions & 16 deletions notes/LeetCode第123号问题:买卖股票的最佳时机III.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,27 @@

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

> 本文首发于公众号「五分钟学算法」,是[图解 LeetCode ](<https://github.com/MisterBooo/LeetCodeAnimation>)系列文章之一。
>
> 个人网站:[https://www.cxyxiaowu.com](https://www.cxyxiaowu.com)
## 动态规划

### 1 概念

  **动态规划**算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。在学习动态规划之前需要明确掌握几个重要概念。

  **阶段**对于一个完整的问题过程,适当的切分为若干个相互联系的子问题,每次在求解一个子问题,则对应一个阶段,整个问题的求解转化为按照阶段次序去求解。
  **阶段**对于一个完整的问题过程,适当的切分为若干个相互联系的子问题,每次在求解一个子问题,则对应一个阶段,整个问题的求解转化为按照阶段次序去求解。

  **状态**状态表示每个阶段开始时所处的客观条件,即在求解子问题时的已知条件。状态描述了研究的问题过程中的状况。
  **状态**状态表示每个阶段开始时所处的客观条件,即在求解子问题时的已知条件。状态描述了研究的问题过程中的状况。

  **决策**决策表示当求解过程处于某一阶段的某一状态时,可以根据当前条件作出不同的选择,从而确定下一个阶段的状态,这种选择称为决策。
  **决策**决策表示当求解过程处于某一阶段的某一状态时,可以根据当前条件作出不同的选择,从而确定下一个阶段的状态,这种选择称为决策。

  **策略**由所有阶段的决策组成的决策序列称为全过程策略,简称策略。
  **策略**由所有阶段的决策组成的决策序列称为全过程策略,简称策略。

  **最优策略**在所有的策略中,找到代价最小,性能最优的策略,此策略称为最优策略。
  **最优策略**在所有的策略中,找到代价最小,性能最优的策略,此策略称为最优策略。

  **状态转移方程**状态转移方程是确定两个相邻阶段状态的演变过程,描述了状态之间是如何演变的。
  **状态转移方程**状态转移方程是确定两个相邻阶段状态的演变过程,描述了状态之间是如何演变的。

### 2 使用场景

Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -134,7 +138,7 @@ class Solution {

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

**注意**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
**注意**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

**示例 1:**

Expand Down Expand Up @@ -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 。

Expand All @@ -286,7 +289,7 @@ class Solution {



###
![](https://bucket-1257126549.cos.ap-guangzhou.myqcloud.com/blog/fz0rq.png)



0 comments on commit 1c20a18

Please sign in to comment.